Bash

Bash 文件存在測試始終為真

  • November 20, 2014

我有以下 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'

這是什麼原因?

為了使這項工作按預期進行,我需要做什麼?

當您的變數為空時,您的命令變為:

[ -e ]

在這種情況下,您[..]使用一個參數呼叫-e。字元串"-e"不為空,因此test返回 true。

此行為由POSIX test定義:

在以下列表中, $ 1, $ 2, $ 3, and $ 4 表示要測試的參數:

0 個參數:

退出假 (1)。

1個論點:

如果 $1 不為空,則退出 true (0);否則,退出假。

….

為了使它工作,你必須雙引號你的變數

[ -e "$MYAPPPATH" ]

這是有效的,因為-e使用空字元串的參數是錯誤的。

引用自:https://unix.stackexchange.com/questions/169020