bash:文件测试表达式评估中的双重vs单括号

ver*_*ose 6 bash shell

我对bash中的文件测试表达式有疑问.这是一个简单的脚本来说明我的问题:

set -x
read -p "Enter a filename: " var1
if [ - e $var1 ]
then
    echo file exists
else
    echo file not found
fi
Run Code Online (Sandbox Code Playgroud)

有三种情况:

  1. 在提示符下,我输入 foo,这是一个存在于我正在运行脚本的目录中的文件.正如预期的那样,输出是 file exists.
  2. 在提示符下,我进入 bar.我正在运行脚本的目录中不存在此类文件.正如预期的那样,输出是 file not found.
  3. 在提示符下,我点击时 <enter> 没有输入任何内容.令人惊讶的是,输出是 file exists.

如果我使用 if [[ -e $var1 ]],即双括号而不是单一,行为是正确的:即使在第三种情况下,我得到file not found.

set -x 在文件的顶部插入了一个 以查看发生了什么.使用单括号,变量的计算结果如下: '[' -e ']'.使用double,它被评估为 [[ -e '' ]].这是有趣的.为什么在这两种情况下表达式的评估方式不同?

我将很感激解释.对不起,如果我错过了明显的.谢谢!

dpp*_*dpp 6

改成 if [ -e "$var1" ]

你可以找到更多的细节[][[ ]] 这里


Ign*_*ams 3

因为这就是他们的工作方式。[[比 更聪明test,除非sh需要严格兼容,否则应该使用 。

  • 我强烈不同意 [[ 应该用于支持测试的说法,并将其重新表述为: '[[ 仅当您绝对确定您的脚本永远不需要在最小 shell 下运行时才应使用.' (4认同)
  • 谢谢伊格纳西奥。根据您的回复,我做了更多搜索,发现了这个链接:[link](http://mywiki.wooledge.org/BashFAQ/031),它解释了很多。 (3认同)