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

fgy*_*ica 6 bash if-statement

所以我有以下小脚本并不断疑惑..

#!/bin/bash

if [ -d $1 ]; then
  echo 'foo'
else
  echo 'bar'
fi
Run Code Online (Sandbox Code Playgroud)

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

fed*_*qui 5

来自:(info coreutils 'test invocation'通过 找到的参考man test):

如果省略 EXPRESSION,test' returns false. **If EXPRESSION is a single argument,则如果参数为 null ,则test' 返回 false,否则返回 true**。参数可以是任何字符串,包括像-d',-1'、-- --',help' 和--version' that most other programs would treat as options. To get help and version information, invoke the commands[ --help' 和 `[ --version'这样的字符串 ,没有通常的右括号。

正确突出显示:

如果 EXPRESSION 是单个参数,如果参数为 null,`test' 返回 false,否则返回 true

所以每当我们这样做时[ something ]true如果它something不为空,它就会返回:

$ [ -d ] && echo "yes"
yes
$ [ -d "" ] && echo "yes"
$ 
$ [ -f  ] && echo "yes"
yes
$ [ t ] && echo "yes"
yes
Run Code Online (Sandbox Code Playgroud)

看到第二个[ -d "" ] && echo "yes"返回false,你就有了解决这个问题的方法:quote$1这样-d总是得到一个参数:

if [ -d "$1" ]; then
  echo 'foo'
else
  echo 'bar'
fi
Run Code Online (Sandbox Code Playgroud)