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

时间:2012-04-28 04:54:45

标签: bash shell

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

set -x
read -p "Enter a filename: " var1
if [ - e $var1 ]
then
    echo file exists
else
    echo file not found
fi

有三种情况:

  1. 在提示符下,我输入foo,这是我运行脚本的目录中存在的文件。正如预期的那样,输出为file exists
  2. 在提示符下,我输入bar。我正在运行脚本的目录中不存在此类文件。正如预期的那样,输出为file not found
  3. 在提示符下,我点击<enter>而没有输入任何内容。令人惊讶的是,输出为file exists
  4. 如果我使用if [[ -e $var1 ]],即双括号而不是单括号,行为是正确的:即使在第三种情况下,我得到file not found

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

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

2 个答案:

答案 0 :(得分:6)

更改为if [ -e "$var1" ]

您可以找到[][[ ]] Here

的更多详细信息

答案 1 :(得分:3)

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