【问题标题】:Syntax error: operand expected (error token is "+)语法错误:预期操作数(错误标记为“+”)
【发布时间】:2020-10-29 17:50:59
【问题描述】:

我收到此错误消息:line 12: 470 + : syntax error: operand expected (error token is "+ ")

最后我仍然得到 470 的答案,但此错误消息显示在输出中,我不明白为什么。谁能解释一下?

这是我的代码:

while IFS= read -r var
do
total=$(($total+$var))
done<"$input"

 

echo "The total is = $total";
echo

我每次的最终输出:

 line 12: 470 + : syntax error: operand expected (error token is "+ ")
The total is = 470

【问题讨论】:

  • 这是因为$var 在循环的最后一次迭代中为空。该文件可能以空行结尾
  • 我不明白我如何更正它,我是否以不同的方式结束它?
  • 你可以在使用前检查$var是否为空
  • 在空行的情况下(即${var} 未定义)您可以将${var} 默认为0:${var:-0}

标签: linux bash shell


【解决方案1】:

基于其他 cmets,我会更改为忽略空行和空格。我没有你的 $input 文件,所以我只是直接在 shell 中输入数据并用 EOF 指示符结束我的数据输入(d for me)

$ total=0;while IFS= read -r var; do [[ -n "${var##*\ }" ]] && total=$(($total+$var)) ; done

1

2
3

^D
$ echo ${total}
6

【讨论】:

    【解决方案2】:

    当您在算术表达式中使用带有取消引用的$ 时,这会阻止特殊算术解析规则(将空字符串视为 0)能够应用。只需取出里面的$s 即可解决您的问题:

    while IFS= read -r var; do
      total=$((total+var))
    done <"$input"
    

    ...或者,为了更清晰(但仅限 bash)语法:

    while IFS read -r var; do
      (( total += var ))
    done <"$input"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-24
      • 1970-01-01
      相关资源
      最近更新 更多