bash的带有循环的奥秘

时间:2014-06-18 15:50:42

标签: bash loops

有一些循环函数:

runcfg () {

o=0

while (( o<3 )); do
  echo $o
  (( o++ ))
done

}

它从另一个脚本manager.sh调用:

...
    -C|--runconfig)
source $APP_BASEDIR/app-install/bin/config_functions; runcfg;
shift;;
...

让我们运行它:

$ bash -x manager.sh -run

看看输出:

...
+ runcfg
+ o=0
+ ((  o<3  ))
+ echo 0
0
+ ((  o++  ))

这就是所有的线......没有其他事情发生。

但是!如果稍微变化并在算术调用后添加&&

runcfg () {

o=0

while (( o<3 )); do
  echo $o
  (( o++ )) && echo ++OK || echo ++ER
done

}

有效!

...
+ runcfg
+ o=0
+ ((  o<3  ))
+ echo 0
0
+ ((  o++  ))
+ echo ++ER
++ER
+ ((  o<3  ))
+ echo 1
1
+ ((  o++  ))
+ echo ++OK
++OK
+ ((  o<3  ))
+ echo 2
2
+ ((  o++  ))
+ echo ++OK
++OK
+ ((  o<3  ))
+ shift
...

这是什么?

1 个答案:

答案 0 :(得分:3)

您的脚本配置为在出错时退出(请注意,它第一次打印++ER),((o++)) == ((0)),它返回1(错误)。选项:

  • 请改用let o++
  • 忽略错误(((o++))||:
  • 使用for循环(for ((o = 0; o < 3; o++))
  • 关闭错误退出(set +e)。