如果没有这样的文件,输出错误

时间:2013-06-29 12:30:54

标签: linux bash shell

我试图找出特定类型的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 ...这样的东西。但作为一个新手,我想知道发布的脚本中的问题。我请你分享你在这方面的知识。

2 个答案:

答案 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}}的好习惯。

    如果无法展开glob,
  • 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

得到它?

底线是:每次在中使用通配符时,请使用$ shopt -u nullglob $ shopt -s failglob $ echo *.txt bash: no match: *.txt $ failglob使脚本更健壮。

作为脸颊底线上的一个舌头:每次你使用没有nullglobfailglob的圆顶时,上帝会杀死一只小猫。

如果您想了解有关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++))