Bash布尔语境下的falsy values有哪些?1是否为假值?
Bash 布尔判定语境下的Falsy值范围说明
核心疑问澄清
数值1会被判定为假的认知是完全错误的,本质是混淆了Bash中三类完全独立的判定语境。
很多人产生这个错觉,是因为Bash约定了命令退出码的通用规则:数值0代表命令执行成功(对应逻辑真),所有非0数值代表执行失败(对应逻辑假),而最常见的执行失败返回的退出码就是1,大家误把这个状态码和"作为判断输入的数值1"等同了。
可以用简单的测试验证:执行if [ 1 ]; then echo "判定为真"; fi,实际会输出"判定为真"——这里的1是test命令(也就是[ ]结构)的输入参数,不是命令的退出返回值,自然不会按照退出码的规则判定。
不同场景下的Falsy值完整列表
场景1:直接将字符串/数值作为if/while等条件的输入判定
这个场景对应[ ]、[[ ]]这类test测试结构,将传入的参数按照字符串语义做判定时,只有两类取值会被判定为假:
- 长度为0的空字符串,即内容为
""、''的空值 - 内容恰好为单个字符"0"的字符串,即取值为
"0"、'0'
除此之外的所有非空字符串都会被判定为真,包括但不限于:内容为"1"、"-1"、"false"、"no"、"123",甚至是仅包含空格的非空字符串" ",都属于真值范畴。
场景2:算术展开语境下的判定(即(( 表达式 ))结构)
这个是Bash中专门用于数值计算的判定场景,判定规则和C语言的数值逻辑完全一致:
- 表达式计算结果为0时,会被判定为假
- 任何计算结果为非0整数的表达式(包括1、-1、100等)都会被判定为真
场景3:以命令执行结果作为判断条件的退出码判定
在这个语境下,不存在对取值本身语义的判断,只和命令最终返回的退出码数值相关:
- 退出码为0时,无论对应的命令是什么,都会被判定为真
- 所有非0的退出码(包括1、2、127、130等各类错误对应的状态值),都会被判定为假
这里需要再次明确:这个场景下的退出码1是执行状态标识,和前两个场景里作为判断输入的数值1没有任何语义关联,绝对不能跨场景套用判定规则。
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

