我试图找出特定类型的no.of文件。如果文件存在则此脚本正常工作,否则执行一次循环(预计不会运行)。
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 ...
这样的东西。但作为一个新手,我想知道发布的脚本中的问题。我请你分享你在这方面的知识。
答案 0 :(得分:5)
你的脚本确实没有问题,除非它可以用更好的样式编写,使用现代内置版,除非没有文本文件就失败,见下文。
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
的{{1}}的好习惯。
failglob
将引发错误failglob
将扩展为空。如果没有这些,nullglob
将会扩展为*.txt
(逐字),如果没有合适的扩展,这正是您想要避免的!
在你的情况下,只需输入
*.txt
在脚本的顶部,你已经完成了!
现在计算shopt -s nullglob
个文件数量的可能方法可能是:
*.txt
关于shopt -s nullglob
a=(*.txt)
echo "There are ${#a[@]} text files"
和nullglob
?
让我们进入临时目录:
failglob
因为glob在那里没有合适的扩展。现在:
$ mkdir scratch; cd scratch
$ # this dir is empty
$ echo *.txt
*.txt
$
因为$ shopt -s nullglob
$ echo *.txt
$
。现在我们将取消设置nullglob
并设置nullglob
:
failglob
得到它?
底线是:每次在bash中使用通配符时,请使用$ shopt -u nullglob
$ shopt -s failglob
$ echo *.txt
bash: no match: *.txt
$
或failglob
使脚本更健壮。
作为脸颊底线上的一个舌头:每次你使用没有nullglob
或failglob
的圆顶时,上帝会杀死一只小猫。
如果您想了解有关nullglob
和shell可选行为的更多信息,请参阅The Shopt Builtin section in the manual。
答案 1 :(得分:1)
当模式*.txt
没有匹配的文件时,它被解释为文字字符串"*.txt"
。这就是你的循环至少运行一次的原因。
有几种方法可以解决这个问题。您可以添加检查是否存在匹配文件,如下所示:
if ls *.txt >/dev/null 2>&1; then
for i in *.txt; do
...
done
fi
根据您在循环中要执行的操作,您还可以使用find
:
find . -maxdepth 1 -name "*.txt" | while read i; do
...
done
然而,有些内容不适用于此构造(如递增$j
),因为while
循环在子shell中运行,因此$j
的所有更改都会丢失子shell退出(即循环终止)。
作为旁注:我会将$j
的增量从j=`expr $j + 1`
更改为((j++))
。