在这个例子中,我有一个包含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