添加变量时出错

添加变量时出错

当我运行以下 bash 脚本时:

Success: $(grep success * | grep B2B | wc -l)
etc_error: $(grep etc_error * | grep B2B | wc -l)
map_timeout: $(grep map_timeout * | grep B2B | wc -l)

success=$(grep success * | grep B2B | wc -l)
etc=$(grep etc_error * | grep B2B | wc -l)
map=$(grep map_timeout * | grep B2B | wc -l)

sum=$(($success + $etc + $map))
total=$(($success / $sum))
echo $total

我收到错误:

-bash: + + : syntax error: operand expected (error token is "+ ")

我的脚本有什么问题吗?

答案1

这并不能解释一切 - 考虑到你的变量声明,它们应该有一个值 - 但因为你正在使用算术展开,不需要$引入变量;未定义的变量则默认为 0:

sum=$((success + etc + map))
total=$((success / sum))
echo "$total"

理想情况下,您应该sum在除法之前检查它是否非零,但即使您不检查sum(“除以 0”而不是“语法错误:预期操作数”,在这种方法中,至少您会收到一条明智的错误消息) bash)。

您收到的错误来自

sum=$(($success + $etc + $map))

由于某种原因,successetcmap均未定义或为空。 shell 将上面的内容扩展为

sum=$(( + + ))

然后尝试扩展它,这会导致您引用的语法错误。

这是相当令人惊讶的,因为

success=$(grep success * | grep B2B | wc -l)

应该产生一个值...

顺便说一句,您可能希望将上述改进为:

success=$(grep success ./* | grep -c B2B)

或者,如果B2B要匹配的内容成功行而不是文件名:

success=$(cat ./* | grep success | grep -c B2B)

或与 GNUgrep或兼容:

success=$(grep -h success ./* | grep -c B2B)

答案2

您必须在加法之前检查变量,因为如果其中一个未设置或没有数值,加法语法将失败

您可以在设置之前将 vars 默认设置为 0 以避免这种情况。

相关内容