6

我对 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.

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

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

我将不胜感激。对不起,如果我错过了明显的。谢谢!

4

2 回答 2

6

改成if [ -e "$var1" ]

您可以在此处[]找到更多详细信息[[ ]]

于 2012-04-28T06:13:47.227 回答
3

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

于 2012-04-28T05:13:11.117 回答