2014-06-18 57 views
0

奥秘与循环的一些功能:bash的带环

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 
... 

这是什么?

+2

“bash与循环的奥秘”这甚至意味着什么?什么是问题? – JakeGould

回答

3

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

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