所以我有下面的小脚本,一直想知道。
#!/bin/bash
if [ -d $1 ]; then
echo 'foo'
else
echo 'bar'
fi
.. 为什么在没有参数的情况下调用时会打印 foo?测试 [-d ] 如何为空字符串返回 true?
发件人: info coreutils 'test invocation'
(通过man test
找到的参考):
如果省略 EXPRESSION,则如果参数为 null 且为 true,则 test
test' returns false. **If EXPRESSION is a single argument,
返回 false 否则**。 参数可以是任何字符串,包括类似-d',
-1'、--',
--help' 和--version' that most other programs would treat as options. To get help and version information, invoke the commands
[ --help' 和 '[ --version',没有通常的结束语 括弧。
正确突出显示:
如果 EXPRESSION 是单个参数,则 'test' 返回 false,如果 参数为空且为
真,否则为真
因此,每当我们执行[ something ]
时,如果该something
不为 null,它将返回true
:
$ [ -d ] && echo "yes"
yes
$ [ -d "" ] && echo "yes"
$
$ [ -f ] && echo "yes"
yes
$ [ t ] && echo "yes"
yes
看到第二个[ -d "" ] && echo "yes"
返回 false,你得到了解决这个问题的方法:引用$1
,以便-d
总是得到一个参数:
if [ -d "$1" ]; then
echo 'foo'
else
echo 'bar'
fi
原因很简单:语法与将-d
识别为处理文件名的运算符的情况不匹配。 它只是作为一个字符串,每个非空字符串都是真的。 只有当给出要-d
的第二个参数时,它才被识别为运算符,以找出给定的 FILE 是否为目录。
这同样适用于所有其他运算符,如-e
、-r
等。
在您的情况下,请使用双引号以避免遇到该"问题":
[ -d "$1" ]
原因
[ -d ] && echo y
生成y
是 shell 在 test
命令中将其解释为字符串并将其计算为 true。 甚至说:
[ a ] && echo y
会产生y
. 引用help test
string True if string is not the null string.
这就是为什么建议引用变量的原因。 谚语:
[ -d "$1" ] && echo y
在没有参数的情况下调用时不应产生y
。