我有一个名为build_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次?
答案 0 :(得分:3)
+=
运算符不符合您的想法;它不是“添加到”运算符,它充当字符串连接运算符。
$ ./foo.sh
./build
count is now 01
./build
count is now 011
经过两次迭代后,count
为011
。使用数字小于运算符-lt
,字符串011
将转换为数字11
。由于11不小于6,因此循环结束。
假设您正在使用bash或其他现代Bourne-family 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))
旧格式
$[expression]
已弃用,将在即将推出的bash版本中删除。表达式被视为在双引号内,但括号内的双引号未被特别处理。表达式中的所有标记都经历参数和变量扩展,命令替换和引用删除。结果被视为要评估的算术表达式。算术扩展可以嵌套。
关于算术评估上下文:
((expression))
根据ARITHMETIC EVALUATION下面描述的规则评估表达式。如果表达式的值不为零,则返回状态为0;否则返回状态为1.这与let“expression”完全相同。