从外部脚本调用内部脚本

时间:2015-12-11 20:00:01

标签: shell unix

我有一个名为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次,因为countbuild运行后增加1。这意味着output.txt应该有5行file build。以下是我实际收到的输出。

building job
wake after sleep
building job
wake after sleep

文件output.txt中只有两行。

file build
file build

为什么循环没有像我预期的那样运行5次?

1 个答案:

答案 0 :(得分:3)

+=运算符不符合您的想法;它不是“添加到”运算符,它充当字符串连接运算符。

$ ./foo.sh
./build
count is now 01
./build
count is now 011

经过两次迭代后,count011。使用数字小于运算符-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”完全相同。