Bash 文件存在测试始终为真

Bash 文件存在测试始终为真

我有以下 bash 脚本行来测试文件是否存在:

MYAPPPATH=$(find $APPDIR -iname myapp* -print)
if [ -e $MYAPPPATH ]
then
    echo "File exists" 
fi

但是,当以“myapp”开头的文件不存在时,因此 MYAPPPATH='',上述检查再次成功。看看使用时set -x文件不存在会发生什么:

++ find /path/to/app -iname 'myapp*' -print
+ MYAPPPATH=
+ '[' -e ']'
+ echo 'File exists'

这是什么原因呢?

我需要做什么才能使这项工作按预期进行?

答案1

当您的变量为空时,您的命令将变为:

[ -e ]

在这种情况下,您可以[..]使用一个参数进行调用-e。 String"-e"不为 null,因此test返回 true。

此行为定义为POSIX测试:

在下面的列表中,$1、$2、$3 和 $4 代表要测试的参数:

0 个参数:

退出假 (1)。

1个参数:

如果 $1 不为 null,则退出 true (0);否则,退出 false。

....

为了让它发挥作用,你必须双引号你的变量:

[ -e "$MYAPPPATH" ]

这是有效的,因为-e参数为空字符串时为 false。

答案2

习惯引用变量。总是引用它们;必要时可以防止误评估:

if [ -e "$MYAPPPATH" ]

使用特定于 bash 的复合命令就不会发生这种情况:

if [[ -e $MYAPPPATH ]]

答案3

还有一些其他方法:

  1. 之前检查变量(根据注释使用版本)

    if [ -n "$MYAPPPATH" ] && [ -e "$MYAPPPATH" ] ; then ...
    
  2. 使用locate* 代替find

    if locate -w "$APPDIR/myapp*" ; then ...
    

*1 使用时locate不要忘记更新文件数据库updatedb

相关内容