当我运行以下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 "+ ")我的剧本怎么了?
发布于 2018-11-14 07:46:00
这并不能解释一切--给定变量声明,它们应该有一个值--但是由于您使用的是算术扩展,所以不需要$来引入变量;然后,未定义的变量默认为0:
sum=$((success + etc + map))
total=$((success / sum))
echo "$total"理想情况下,您应该在除法前检查sum是否为非零,但是即使不检查sum (“除法为0”,而不是“语法错误:操作数期望”,在bash中),也至少可以得到一条合理的错误消息。
你所犯的错误
sum=$(($success + $etc + $map))由于某些原因,success、etc和map都是未定义或空的。外壳将上面的内容扩展到
sum=$(( + + ))然后尝试展开它,这会导致引用的语法错误。
不过,这是相当令人惊讶的,因为
success=$(grep success * | grep B2B | wc -l)应该产生价值..。
顺便说一句,您可能希望将上面的内容改进为:
success=$(grep success ./* | grep -c B2B)或者,如果要在成功行的内容上而不是在文件名上匹配B2B:
success=$(cat ./* | grep success | grep -c B2B)或与GNU grep或兼容:
success=$(grep -h success ./* | grep -c B2B)发布于 2018-11-14 07:39:41
必须在添加之前检查变量,因为如果其中一个未设置或没有数值,则加法语法将失败。
您可以在设置之前将vars设置为0以避免这种情况。
https://unix.stackexchange.com/questions/481633
复制相似问题