`if[-f*.png]]`总是返回false

  • 本文关键字:返回 false png if bash
  • 更新时间 :
  • 英文 :


在这个例子中,我有一个包含2个PNG文件的目录:

% ls test_folder
1.png 2.png

列出目录中的所有PNG文件很有效:

% echo test_folder/*.png
test_folder/1.png test_folder/2.png

但是,检查目录是否包含任何PNG文件总是返回false。

% if [[ -f test_folder/*.png ]]; then echo 'found'; else echo 'not found'; fi
not found

这个向导告诉我,这是可行的。我哪里错了?请原谅我对Bash的理解有限。

在bash手册中解释:

[[expression]]根据的评估返回0或1的状态条件表达式。表达式为由以下所述的初级组成条件表达式分词和路径名在[[和]];波浪形展开、参数和变量展开,算术扩展、命令替换、处理执行引用、替换和引用移除。条件运算符(如-f(必须不加引号才能为被公认为初级。

相反,您可以使用数组并检查计数:

shopt -s nullglob #  prevents non-matching glob expanding to itself
#  can enable later if you prefer to keep that behaviour
pngs=(test_folder/*.png)
if [[ ${#pngs[@]} -gt 0 ]] ; then echo 'found'; else echo 'not found'; fi

最新更新