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

标签 linux bash shell

我正在尝试找出特定类型的文件数量。如果文件存在,那么这个脚本工作正常,否则循环执行一次(预计不会运行)。

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

使用通配符时,始终使用 nullglobfailglob 是一个很好的做法。

  • failglob 如果无法扩展 glob 将引发错误,
  • 如果没有合适的扩展,
  • nullglob 将扩展为空。

没有这些,如果没有合适的扩展,*.txt 将扩展为 *.txt(逐字),这正是您要避免的!

在你的情况下,只要把

shopt -s nullglob

在你的脚本的顶部,你就完成了!

现在计算 *.txt 文件数量的可能方法是:

shopt -s nullglob
a=(*.txt)
echo "There are ${#a[@]} text files"

nullglobfailglob 有什么大惊小怪的?

让我们进入一个临时目录:

$ 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
$

明白了吗?

底线是:每次您在 中使用 globbing ,使用 failglobnullglob 使您的脚本更健壮。

作为面颊底线的舌头:每次您在没有 failglobnullglob 的情况下使用通配符时,上帝杀死了一只小猫。

如果您想了解有关 shopt 和 shell 可选行为的更多信息,请参阅 The Shopt Builtin section in the manual .

关于linux - 如果没有这样的文件,则输出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17380185/

相关文章:

linux - 如何将 bash 命令作为键的值存储在文件中,然后读取文件并使用 bash 脚本执行命令?

linux - 在 Bash 中执行 TAR 失败

linux - 在同一个 shell 中执行一个 block

linux - Linux/Unix shell 脚本中的冒泡排序

c++ - g++编译错误.h文件

c++ - 用 g++ 编译包含 cppunit 的程序

linux - bash 命令 'echo -n -e "\x8 7">/dev/ttyAMA0' 无法从 shell 脚本运行

bash - FFmpeg 脚本不循环

mysql - 我无法使用 shell 将值插入到 mysql 表中

用于登录网站的 Shell 脚本