所以我有以下小脚本,一直想知道......
#!/bin/bash
if [ -d $1 ]; then
echo 'foo'
else
echo 'bar'
fi
..为什么在没有参数的情况下调用时会打印foo?对于空字符串,test [-d]如何返回true?
答案 0 :(得分:3)
原因
[ -d ] && echo y
生成y
是shell在test
命令中将其解释为 string 并将其评估为true。甚至说:
[ a ] && echo y
会产生y
。引自help test
:
string True if string is not the null string.
这就是推荐引用变量的原因。话说:
[ -d "$1" ] && echo y
在不带参数的情况下调用时不应生成y
。
答案 1 :(得分:3)
发件人:info coreutils 'test invocation'
(通过man test
找到参考号):
如果省略EXPRESSION,如果参数为null且为true,则
test' returns false. **If EXPRESSION is a single argument,
test'返回false 除此以外**。参数可以是任何字符串,包括字符串-d',
- 1',--',
- 帮助'和--version' that most other programs would treat as options. To get help and version information, invoke the commands
[ - help'和`[--version',没有通常关闭 括号中。
正确突出显示:
如果EXPRESSION是单个参数,那么`test'如果返回false则返回false 参数为null,否则为
因此,每当我们执行[ something ]
时,如果true
不为空,则会返回something
:
$ [ -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
答案 2 :(得分:3)
原因很简单:语法与-d
被识别为处理文件名的运算符的情况不匹配。它只是作为一个字符串,每个非空字符串都是true。仅当给出-d
的第二个参数时,才会将其识别为运算符,以确定给定的FILE是否为目录。
这同样适用于所有其他运营商,例如-e
,-r
等。
在您的情况下,请使用双引号以避免遇到“问题”:
[ -d "$1" ]