Bash条件判断时报[: -gt: unary operator expected错误原因求解
错误原因
- 变量未加双引号包裹,空值会导致条件表达式解析异常
当$start_step_i未设置为空时,[ -n $start_step_i ]会被shell解析为[ -n ],此时-n会被当作非空字符串处理,整个条件判定结果为真,会继续执行大括号内的代码。此时大括号内的[ $start_step_i -gt 0 ]会被解析为[ -gt 0 ],缺少左操作数,直接抛出「[: -gt: unary operator expected」的一元运算符预期错误。 - 条件表达式语法错误
[ $start_step_i -le 4]中4和右方括号]之间缺少空格,不符合shell中[命令的语法要求,也会触发语法报错。 - 后续
start_step变量未做判空处理
如果前面的条件都不满足,$start_step变量未被定义,后续[ $start_step == 1 ]同样会触发一元运算符预期错误。
修复方案
把所有变量用双引号包裹,同时补全语法空格,也可以改用[[ ]](Bash支持的强判断语法,自带空值处理特性)避免引号问题,两种修复方式如下:
兼容POSIX标准的修复写法
[ -n "$start_step_i" ] && { [ "$start_step_i" -gt 0 ] && [ "$start_step_i" -le 4 ] && start_step="$start_step_i" } [ "$start_step" == "1" ] && echo "Running all steps"
Bash专属简化写法
[[ -n $start_step_i && $start_step_i -gt 0 && $start_step_i -le 4 ]] && start_step=$start_step_i [[ $start_step == 1 ]] && echo "Running all steps"
内容的提问来源于stack exchange,提问作者Zoro Steve
相关产品推荐
相关产品推荐

