Shell 从外部脚本调用内部脚本
我有一个脚本名为Shell 从外部脚本调用内部脚本,shell,unix,Shell,Unix,我有一个脚本名为build\u other: count=0 while [ $count -lt 6 ] do ./build count+=1 done 从这个脚本中,您可以看到我正在调用第二个脚本,名为build: echo "building job" sleep 30s echo "wake after sleep" echo "file build" >> output.txt 我预计build应该触发5次,因为count在build运行后增加1。这意
build\u other
:
count=0
while [ $count -lt 6 ]
do
./build
count+=1
done
从这个脚本中,您可以看到我正在调用第二个脚本,名为build
:
echo "building job"
sleep 30s
echo "wake after sleep"
echo "file build" >> output.txt
我预计build
应该触发5次,因为count
在build
运行后增加1。这意味着,output.txt
应该有5行文字说明file build
。以下是我实际收到的输出
building job
wake after sleep
building job
wake after sleep
文件output.txt
中只有两行
file build
file build
为什么循环没有像我预期的那样运行5次?操作符没有按照您的想法执行;它不是“添加到”运算符,而是充当字符串连接运算符
$ ./foo.sh
./build
count is now 01
./build
count is now 011
两次迭代后,count
为011
。使用数字小于运算符-lt
,将字符串011
转换为数字11
。因为11不小于6,所以循环结束
假设您使用的是bash或其他现代Bourne系列shell,您可以通过几种方法解决这个问题
# Using arithmetic expansion -- $(( expression ))
count=$((count + 1))
# Increment variable in an arithmetic evaluation context -- (( ))
(( count++ ))
# When declaring count, declare that it is an integer value. Declared an
# integer, the += operator will behave as you originally expected it would.
declare -i count=0
下面是bash手册页的一些摘录
关于+=
运算符的行为:
在赋值语句将值赋值给shell变量或数组索引的上下文中,+=
运算符可用于追加或添加变量的上一个值。当将+=
应用于已设置整数属性的变量时,值将作为算术表达式进行计算,并添加到变量的当前值中,该值也将进行计算。当使用复合赋值将+=
应用于数组变量时(请参见下面的数组),变量的值不会取消设置(就像使用=
时一样),新值将从大于数组最大索引的一个开始追加到数组中(对于索引数组)或作为关联数组中的附加键值对添加。应用于字符串值变量时,值将展开并附加到变量的值
关于算术评估:
算术展开允许计算算术表达式并替换结果。算术展开的格式为:
$((表达式))
旧格式$[expression]
已被弃用,并将在即将发布的bash版本中删除
表达式被视为包含在双引号内,但括号内的双引号并不是特别处理的。表达式中的所有标记都经过参数和变量扩展、命令替换和引号删除。结果被视为要求值的算术表达式。算术展开可以是嵌套的
关于算术评估上下文:
((表达式))
表达式将根据下面“算术求值”下描述的规则求值。如果表达式的值为非零,则返回状态为0;否则返回状态为1。这完全等同于let“表达式”
使用
declare-i count=0
重新运行脚本,查看下面Dan的答案以获得完整的解释。答案很好。您可能希望提及一些直接赋值的替代方法,如((count++)
,或者只需在count
上设置整数标志(例如声明-i count=0
)。尽管如此,还是值得投票表决。(还有,只是一个小问题,在复制手册页时,请检查连字符(例如,可变的
)以使其更好地阅读——我知道这是一个痛苦的问题……)好的建议;我已经包括了两种选择,固定的连字号,并添加了更多的bash(1)摘录。一个问题三个答案和很好的解释谢谢Dan Lowe它解决了我的问题,三个解决方案也为我解决了