You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash未传参数时[ -z $num ]返回退出码0的原因咨询

为什么未传参数时[ -z $num ]返回退出码0?

嘿,这个坑我之前踩过!其实问题出在Shell变量展开的方式和test命令(也就是[)的行为上,咱们一步步拆解:

1. 未传参数时$num的状态

当你没有传递参数给脚本时,$num是一个未定义的变量。在默认的Bash环境下(没有开启set -u选项),未定义的变量会被展开成空字符串。但关键是你写的表达式是[ -z $num ]——这里没有给$num加双引号,这就出问题了!

2. 无引号展开后的表达式

当$num被展开为空字符串时,整个表达式会变成:

[ -z ]

这时候test命令([是它的别名)接收到的只有一个参数:-z。

3. test命令的单参数行为

test命令的规则是:如果只传入一个参数,它会判断这个参数是否非空。-z本身是一个非空的字符串,所以test会返回退出码0(也就是“真”),这就是你看到的结果。

正确的写法

要避免这个问题,一定要给变量加上双引号,这样不管变量是空还是未定义,都会被当作一个完整的参数传递给test:

[ -z "$num" ]

这时候如果$num为空/未定义,表达式会变成[ -z "" ],-z会正确检查空字符串,返回0;如果$num有值,就会检查这个非空字符串,返回1。

如果你的需求是“当且仅当参数不为空时表达式为真”,那更直接的写法是用-n(检查非空),或者直接判断变量本身:

# 两种写法等价,都能实现需求
[ -n "$num" ]
[ "$num" ]

另外,如果你想避免未定义变量的问题,可以在脚本开头加上set -u,这样引用未定义变量时Shell会直接报错,而不是偷偷展开为空字符串。

内容的提问来源于stack exchange,提问作者Nicolás Alarcón Rapela

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:19:25