prompt> if [ -f ]; then echo "true"; fi
true
为什么if条件评估为true?-f不应该需要一个论点吗?
prompt> if [ -f $1 ]; then echo "true"; fi
这是否意味着在继续执行if条件之前,我总是需要检查参数$1是否不为空?
[ -f ]
导致成功退出代码的原因是手册中的这一位:
-n字符串
字符串
如果字符串的长度为非零,则为True。
在谈到test
/[
:时也对此进行了解释
测试和[内置]使用一个集计算条件表达式基于参数数量的规则。
0个参数
表达式为false。
1个参数
当且仅当参数不为null时,表达式为true。
2个参数
如果第一个参数是"!",当且仅当第二个参数为null时,表达式为true。如果第一个参数是一元条件运算符之一(请参见Bash条件表达式),则如果一元测试为true,则表达式为true。如果第一个参数不是有效的一元运算符,则表达式为false。
3个参数
4个参数
5个或更多参数
因此,当您希望使用双参数测试时,shell会看到单参数版本,并针对空字符串测试字符串-f
。
即CCD_ 5与CCD_。
你可以通过在测试中引用你的变量来避免这个问题:
if [ -f "$1" ]; then echo true; fi
通常,您希望始终引用变量展开式。
您可以使用if [[ ]]
语法或通过在当前代码中引用变量$1
来避免这种情况。
示例:
if [ -f "$1" ]; then echo "true"; fi
或者:
if [[ -f $1 ]]; then echo "true"; fi
注意:总是尽量引用变量。