POSIX Shell中如何将布尔表达式结果赋值给变量
报错原因
你写的wordEmpty=$( [ "$word" = "" ] )无法运行的核心问题是:
POSIX Shell 中[(即test命令)是通过退出状态码返回判断结果的,执行时不会向标准输出打印任何内容。而命令替换$()的作用是捕获内部命令的标准输出、替换到对应位置,这行代码执行时,$()捕获到的内容是空字符串,Shell 会尝试把这个空字符串当作可执行命令运行,自然就会抛出「permission denied」错误。
无if的POSIX兼容实现
直接用Shell的短路逻辑符&&、||配合test命令即可完成赋值,全程不需要if语句,完全兼容标准POSIX环境:
# -z 参数是test内置的、专门用于判断字符串是否为空的参数 [ -z "$word" ] && wordEmpty=true || wordEmpty=false
这行代码的执行逻辑:
- 若
[ -z "$word" ]判断为真(变量word是空字符串),test命令返回0状态码,触发&&后的逻辑,将wordEmpty赋值为true - 若判断为假,test命令返回非0状态码,触发
||后的逻辑,将wordEmpty赋值为false
赋值完成后,后续可以直接把wordEmpty作为布尔判断使用,比如$wordEmpty && echo "word is empty",符合Shell的常规使用习惯。
补充:不需要额外绕路捕获
$?状态值,短路逻辑的写法是所有POSIX兼容Shell都支持的标准写法,没有兼容性问题。
内容的提问来源于stack exchange,提问作者AnonymousBoy
相关产品推荐
相关产品推荐

