实际上,您的脚本没有问题,除了可以使用现代内置程序以更好的风格编写之外,如果没有文本文件它会失败,请参见下文。
echo "Checking for text files..."
j=0
for i in *.txt; do
echo "$i"
((++j))
done
if ((j!=0)); then
echo "No. of Text files: $j"
else
echo "No Text files."
fi
使用 globbing 时,最好使用nullglob
.failglob
failglob
如果无法扩展 glob,将引发错误,
nullglob
如果没有合适的扩展,只会扩展为空。
没有这些,如果没有合适的扩展,*.txt
将扩展为*.txt
(逐字),这正是您要避免的!
在你的情况下,只要把
shopt -s nullglob
在脚本的顶部,您就完成了!
现在计算文件数量的一种可能方法*.txt
是:
shopt -s nullglob
a=(*.txt)
echo "There are ${#a[@]} text files"
这是什么大惊小怪的nullglob
和failglob
?
让我们进入一个临时目录:
$ mkdir scratch; cd scratch
$ # this dir is empty
$ echo *.txt
*.txt
$
因为 glob 在那里没有合适的扩展。现在:
$ shopt -s nullglob
$ echo *.txt
$
因为nullglob
. 现在我们将取消设置nullglob
并设置failglob
:
$ shopt -u nullglob
$ shopt -s failglob
$ echo *.txt
bash: no match: *.txt
$
得到它?
底线是:每次您在bash中使用 globbing 时,请使用failglob
ornullglob
使您的脚本更加健壮。
作为脸颊底线的舌头:每次您使用不带failglob
or的 globbing 时nullglob
,上帝都会杀死一只小猫。
如果您想了解有关shopt
shell 可选行为的更多信息,请参阅手册中的 Shopt Builtin 部分。