首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误添加变量

错误添加变量
EN

Unix & Linux用户
提问于 2018-11-14 07:31:53
回答 2查看 164关注 0票数 -1

当我运行以下bash脚本时:

代码语言:javascript
复制
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

我发现了一个错误:

代码语言:javascript
复制
-bash: + + : syntax error: operand expected (error token is "+ ")

我的剧本怎么了?

EN

回答 2

Unix & Linux用户

发布于 2018-11-14 07:46:00

这并不能解释一切--给定变量声明,它们应该有一个值--但是由于您使用的是算术扩展,所以不需要$来引入变量;然后,未定义的变量默认为0:

代码语言:javascript
复制
sum=$((success + etc + map))
total=$((success / sum))
echo "$total"

理想情况下,您应该在除法前检查sum是否为非零,但是即使不检查sum (“除法为0”,而不是“语法错误:操作数期望”,在bash中),也至少可以得到一条合理的错误消息。

你所犯的错误

代码语言:javascript
复制
sum=$(($success + $etc + $map))

由于某些原因,successetcmap都是未定义或空的。外壳将上面的内容扩展到

代码语言:javascript
复制
sum=$(( + + ))

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

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

代码语言:javascript
复制
success=$(grep success * | grep B2B | wc -l)

应该产生价值..。

顺便说一句,您可能希望将上面的内容改进为:

代码语言:javascript
复制
success=$(grep success ./* | grep -c B2B)

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

代码语言:javascript
复制
success=$(cat ./* | grep success | grep -c B2B)

或与GNU grep或兼容:

代码语言:javascript
复制
success=$(grep -h success ./* | grep -c B2B)
票数 2
EN

Unix & Linux用户

发布于 2018-11-14 07:39:41

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

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

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/481633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档