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它解决了我的问题,三个解决方案也为我解决了