Unix shell-无参数的文件测试运算符


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

注意:总是尽量引用变量。

相关内容

  • 没有找到相关文章

最新更新