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

Bash Unix shell-无参数的文件测试运算符,bash,unix,Bash,Unix,为什么if条件的计算结果为true?难道-f不需要一个参数吗 prompt> if [ -f ]; then echo "true"; fi true 这是否意味着在继续执行if条件之前,我总是需要检查参数$1是否为空?您可以使用if[[]]语法或仅通过在当前代码中引用变量$1来避免这种情况 例如: prompt> if [ -f $1 ]; then echo "true"; fi 或: 注意:始终尝试引用变量。导致成功退出代码的原因是因为以下位: -n字符串 串 如果字符串长

为什么if条件的计算结果为true?难道-f不需要一个参数吗

prompt> if [ -f ]; then echo "true"; fi
true

这是否意味着在继续执行if条件之前,我总是需要检查参数$1是否为空?

您可以使用
if[[]]
语法或仅通过在当前代码中引用变量
$1
来避免这种情况

例如:

prompt> if [ -f $1 ]; then echo "true"; fi
或:


注意:始终尝试引用变量。

导致成功退出代码的原因是因为以下位:

-n字符串

如果字符串长度非零,则为True

这在谈论
测试时也有解释:

test和[builtins使用集合计算条件表达式 基于参数数量的规则

0个参数

这个表达是错误的

1参数

当且仅当参数不为null时,表达式才为true

2个论点

如果第一个参数为“!”,则当且仅当第二个参数为null时,表达式才为true。如果第一个参数是一元条件运算符之一(请参见Bash条件表达式),则如果一元测试为true,则表达式为true。如果第一个参数不是有效的一元运算符,则表达式为false

3个论点

4个论点

5个或更多参数

因此,当您希望使用双参数测试时,shell会看到单参数版本,并针对空字符串测试字符串
-f

也就是说,
[word]
相当于
[-n word]

您可以通过在测试中引用变量来避免此问题:

if [[ -f $1 ]]; then echo "true"; fi
通常,您希望始终引用变量展开式

if [[ -f $1 ]]; then echo "true"; fi
if [ -f "$1" ]; then echo true; fi