Bash如果[-d $ 1]为空$ 1返回true

时间:2014-02-10 13:38:41

标签: bash if-statement

所以我有以下小脚本,一直想知道......

#!/bin/bash

if [ -d $1 ]; then
  echo 'foo'
else
  echo 'bar'
fi

..为什么在没有参数的情况下调用时会打印foo?对于空字符串,test [-d]如何返回true?

3 个答案:

答案 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" ]