Bash循环结构中的无效表达式有哪些?如何构造触发false退出状态的无效表达式?
for ((...))返回false的无效表达式构造方法 根据Bash参考手册中关于C风格for循环的定义,只要循环的三个表达式(expr1/expr2/expr3)中任意一个是无效的Shell算术表达式,整个for命令就会返回false(退出状态非0)。以下是几种常见的构造方式:
语法错误的算术表达式
比如缺少操作数或运算符的不完整表达式,Bash无法解析为合法算术运算:for (( x + ; ; )) ; do echo test ; done执行时会直接报错
bash: ((: x + : syntax error: operand expected (error token is "+ "),且整个for命令的退出状态为1(即false)。使用未定义且非数字的标识符
如果表达式中引用的不是数字、已定义变量,也不是合法的算术常量(比如十六进制0xff这类),Bash会判定为无效:for (( x = invalid_string; ; )) ; do echo test ; done报错
bash: ((: x = invalid_string: syntax error in expression (error token is "invalid_string"),退出状态为1。包含无效运算符
使用Bash算术不支持的运算符,比如自定义的非标准符号:for (( x @@ 5; ; )) ; do echo test ; done报错
bash: ((: x @@ 5: syntax error in expression (error token is "@@ 5"),触发false退出状态。括号不匹配或嵌套错误
算术表达式的括号结构不符合语法规则:for (( x = (1 + 2; ; )) ; do echo test ; done报错
bash: ((: x = (1 + 2: syntax error: unexpected end of file,同样返回非0退出状态。
需要注意的是:如果表达式中引用未定义的变量,Bash会默认将其当作0处理(不算无效),比如for (( x = y; ; ))中y未定义,不会触发无效,而是将x设为0继续执行循环。只有当表达式完全无法被解析为合法Shell算术运算时,才会返回false。
内容的提问来源于stack exchange,提问作者Lasy

