这是代码,
x=
if [ -d $x ]; then
echo "it's a dir"
else
echo "not a dir"
fi
Run Code Online (Sandbox Code Playgroud)
上面的代码给了我"it's a dir",为什么?$x是空的,不是吗?
x=
if [ -d $x ]; then
Run Code Online (Sandbox Code Playgroud)
相当于:
if [ -d ] ; then
Run Code Online (Sandbox Code Playgroud)
一种更简单的方式来演示正在发生的事情:
test -d ; echo $?
Run Code Online (Sandbox Code Playgroud)
打印0,表示测试成功([实际上是一个命令,相当于test它需要一个终止]参数.)
但是这个:
test -f ; echo $?
Run Code Online (Sandbox Code Playgroud)
做同样的事情.这是否意味着缺少的参数既是目录又是普通文件?
不,这意味着它没有进行那些测试.
根据test命令的POSIX规范,其行为取决于它接收的参数数量.
使用0参数,它以状态1退出,表示失败.
如果参数不为空,则退出时状态为0(成功);如果参数为空,则退出状态为1(成功).
以2个参数,该结果依赖于第一个参数,其可以是!(其反转行为1个参数),或"一元伯"喜欢-f或-d,或别的东西; 如果它是其他的东西,结果是未指定的.
(POSIX还指定了超过2个参数的行为,但这与此问题无关.)
所以这:
x=
if [ -d $x ]; then echo yes ; else echo no ; fi
Run Code Online (Sandbox Code Playgroud)
打印"是",不是因为缺少的参数是目录,而是因为单个参数-d不是空字符串.
顺便说一句,GNU Coreutils手册没有提到这一点.
所以不要这样做.如果要测试是否$x是目录,请将其用双引号括起来:
if [ -d "$x" ] ; then ...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1570 次 |
| 最近记录: |