【问题标题】:Converting string to integer in Linux using shell [duplicate]使用shell在Linux中将字符串转换为整数[重复]
【发布时间】:2021-04-17 01:59:43
【问题描述】:

我正在尝试读取包含值“0”的文件,该值用双引号引起来。在此之后,我需要根据类似的值执行决策

while read line;do result=$line;done < File.csv
if [ $result -gt 0 ]

then
       echo "Failed"
fi

现在这给了我预期的整数错误。请帮忙。

【问题讨论】:

  • 您可以在 C++ 或 Python 中找到解析 CSV 文件的库。你为什么不使用其中之一?至少,在EBNF 符号中指定有效输入的语法。还可以考虑使用GNU gawkGNU guile,因为CSV 文件定义不明确。
  • 不清楚你为什么要比较fresult而不是result;这只是一个错字,还是你希望fresult 神奇地包含一些东西?

标签: shell


【解决方案1】:

Linux 是一个内核。您显示的脚本是一个 shell 脚本。

在 Bourne shell 系列中,所有原子变量都是字符串。 (在 Bash / ksh / etc 中也有数组,它们是字符串的集合。)

要去掉字符串两边的引号,试试这个parameter expansions序列:

value=${value%\"}
value=${value#\"}

使用 shell 内置程序将比使用外部进程快得多,但如果您在询问之前已经用谷歌搜索过,这些中的每一个都应该是相当明显的:

value=$(echo "$value" | tr -d '"')            # discards " everywhere
value=$(sed 's/^"\(.*\)"$/\1/' <<<"$value")   # Bash specific <<<here string
value=$(awk -v val="$value" 'BEGIN { sub(/^"/, "", val); sub(/"$/, "", val); print val }')

您的循环将读取并丢弃文件中的所有值,然后处理文件最后一行中的任何内容。我猜你想处理 inside 循环中的每个值?

while IFS="" read -r line; do
    result=${line%\"}
    result=${result#\"}
    [ $result -gt 0 ] && { echo "Failed" >&2; exit 1; }
done < File.csv

(注意 IFS=""read -r,并将错误消息打印到标准错误而不是标准输出)但是 很多 更好的解决方案是为此使用 Awk(shell 的 while read -rhorribly inefficient and usually wrong);

awk '{ sub(/^"/, ""); sub(/"$/, "");
    if (0+$0 > 1) { print "Failed" >>"/dev/stderr"; exit 1 } }' File.csv

【讨论】:

  • 感谢使用以下解决了问题 value=${value%\"} value=${value#\"}
  • 感谢您的接受,但如果您不接受可能会更好,以便可以将这个问题作为冗余副本删除。
猜你喜欢
  • 2010-11-21
  • 2017-09-16
  • 2013-10-06
  • 2015-03-14
  • 2011-07-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-28
相关资源
最近更新 更多