如果 [ -d $1] 返回 true 表示空 $1,则 Bash



所以我有下面的小脚本,一直想知道。

#!/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

相关内容

  • 没有找到相关文章

最新更新