理解Bash中test -z与test -n的区别及空变量场景执行异常问题
问题原因:Shell 未加双引号的变量扩展规则
你遇到的现象是 Shell 变量扩展时未加双引号导致的,和 test 命令的参数解析逻辑有关,和 -n 参数本身的功能无关。
核心逻辑
当你把 thing 设为空字符串后,执行 test -n $thing 时,Shell 会先做变量扩展:空值的 $thing 会被直接丢弃,最终实际执行的命令是 test -n,而非你预期的 test -n ""。
而 test 命令有一条隐含的解析规则:如果 test 后只有1个非空参数,命令直接返回真。此时 -n 本身就是那个非空参数,所以 test 返回真,后续的 echo "x${thing}x" 就会执行,输出 xx。
补充说明
你之前测试 -z 参数时没出问题只是巧合:当 thing 为空时,test -z $thing 扩展后也是单参数 test -z,按照上述规则返回真,刚好和 test -z "" 的预期结果一致,所以你没察觉到问题。
正确写法
所有在 test 命令中使用的变量都应该用双引号包裹,避免空值、含空格的变量值被错误解析:
# 加双引号后结果就符合预期了 thing="" test -n "$thing" && echo "x${thing}x" # 不会输出任何内容,符合预期
内容的提问来源于stack exchange,提问作者Red Cricket
相关产品推荐
相关产品推荐

