我正在尝试找出特定类型的文件数量。如果文件存在,那么这个脚本工作正常,否则循环执行一次(预计不会运行)。
echo "Checking for text files..."
j=0
for i in *.txt;
do
echo $i;
j=`expr $j + 1`;
done
if [ $j -ge 0 ];then
echo "No.of Text files:"$j
else
echo "No Text files."
fi
可能有一些其他的方式来完成同样的事情,比如 ls *.txt |xargs ...
。但是作为新手,我想知道发布的脚本中的问题。我请求你分享你在这方面的知识。
最佳答案
你的脚本没有问题,真的,除了它可以用更好的风格编写,使用现代内置函数,除了如果没有文本文件它会失败,见下文。
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
使用通配符时,始终使用 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
或 nullglob
使您的脚本更健壮。
作为面颊底线的舌头:每次您在没有 failglob
或 nullglob
的情况下使用通配符时,上帝杀死了一只小猫。
如果您想了解有关 shopt
和 shell 可选行为的更多信息,请参阅 The Shopt Builtin section in the manual .
关于linux - 如果没有这样的文件,则输出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17380185/