求解Bash中包含函数返回值多条件的while语句语法
Bash while多条件语句修正方案
你的代码问题出在两个核心点:
func -gt 0的写法完全错误,Bash会把-gt和0当成函数的参数传递,而非条件判断逻辑- 函数的return返回值是退出状态码,需要通过
$?变量获取,且数值比较必须放在[ ]或[[ ]]这类条件表达式结构中
下面是几种正确的实现方式:
写法一:先存储返回值再判断
func() { return 12 } ATTEMPTS=0 MAXATTEMPTS=2 while true; do # 调用函数并保存返回的状态码 func ret_code=$? # 同时满足两个条件才执行循环体 if [ $ret_code -gt 0 ] && [ $ATTEMPTS -lt $MAXATTEMPTS ]; then echo "Hello" ATTEMPTS=$((ATTEMPTS+1)) else break fi done
写法二:在while条件中直接组合判断
func() { return 12 } ATTEMPTS=0 MAXATTEMPTS=2 # 用大括号分组,确保先执行函数再判断其返回值 while { func; [ $? -gt 0 ]; } && [ $ATTEMPTS -lt $MAXATTEMPTS ]; do echo "Hello" ATTEMPTS=$((ATTEMPTS+1)) done
额外提示
如果你的函数是要返回业务数字结果而非退出状态码,更合理的方式是用echo输出数值,再通过$(func)捕获,比如:
func() { echo 12 } ATTEMPTS=0 MAXATTEMPTS=2 # 直接比较函数输出的数值 while [ $(func) -gt 0 ] && [ $ATTEMPTS -lt $MAXATTEMPTS ]; do echo "Hello" ATTEMPTS=$((ATTEMPTS+1)) done
内容的提问来源于stack exchange,提问作者Anders
相关产品推荐
相关产品推荐

