当我运行以下 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))
由于某种原因,success
、etc
和map
均未定义或为空。 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 以避免这种情况。