Shell嵌套while循环变量自增自减报整数表达式错误如何解决
问题原因
报错核心由两个错误导致:
- 你使用单引号包裹
expr表达式做变量赋值,单引号会保留字符串字面含义,没有实际执行计算命令:你写的b='expr $b - 1'是直接把字符串expr $b - 1赋值给了变量b,而非执行expr计算数值,后续循环做数值比较时,变量b存储的是字符串而非整数,就会触发“integer expression expected”报错。 - 你没有给变量a设置初始值,第一次执行外层while的数值判断时
$a是空值,也会导致判断失败。
修正方案
方案1:修正命令替换写法(保留expr用法)
把包裹expr的单引号替换为反引号(命令替换标识),同时给变量a加初始值0即可,修正后代码如下:
# 给a设置初始值 a=0 while [ "$a" -le 10 ] do b="$a" while [ "$b" -ge 0 ] do echo -n "$b " # 用反引号执行expr命令,替换单引号 b=`expr $b - 1` done # 用反引号执行expr命令,替换单引号 a=`expr $a + 1` # 换行输出下一行 echo done
方案2:使用Shell原生算术扩展(更简洁,无需expr)
现在Shell都支持原生算术运算语法$((运算表达式)),写法更简单也不容易出现引号问题,推荐用这种写法:
a=0 while [ "$a" -le 10 ] do b="$a" while [ "$b" -ge 0 ] do echo -n "$b " b=$((b-1)) done a=$((a+1)) echo done
内容的提问来源于stack exchange,提问作者Upender
相关产品推荐
相关产品推荐

