我试图找出特定类型的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
Run Code Online (Sandbox Code Playgroud)
可能还有其他一些方法可以达到同样的效果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
Run Code Online (Sandbox Code Playgroud)
当使用通配,它总是要使用一个很好的做法nullglob的failglob.
failglob 如果不能扩展glob,会引发错误,nullglob 如果没有合适的扩展,它将扩展为空.没有这些,如果没有合适的扩展,*.txt将扩展为*.txt(逐字),这正是你想要避免的!
在你的情况下,只是把
shopt -s nullglob
Run Code Online (Sandbox Code Playgroud)
在脚本的顶部,你就完成了!
现在计算*.txt文件数量的可能方法可能是:
shopt -s nullglob
a=(*.txt)
echo "There are ${#a[@]} text files"
Run Code Online (Sandbox Code Playgroud)
这是什么大惊小怪nullglob和failglob?
我们进入一个临时目录:
$ mkdir scratch; cd scratch
$ # this dir is empty
$ echo *.txt
*.txt
$
Run Code Online (Sandbox Code Playgroud)
因为glob在那里没有合适的扩展.现在:
$ shopt -s nullglob
$ echo *.txt
$
Run Code Online (Sandbox Code Playgroud)
因为nullglob.现在我们将取消设置nullglob并设置failglob:
$ shopt -u nullglob
$ shopt -s failglob
$ echo *.txt
bash: no match: *.txt
$
Run Code Online (Sandbox Code Playgroud)
得到它?
底线是:每次在bash中使用globbing时,使用failglob或nullglob使脚本更健壮.
作为一个舌头在脸颊底线:每次你使用没有failglob或没有或nullglob,上帝杀死一只小猫.
如果您想了解有关shoptshell可选行为的更多信息,请参阅手册中的Shopt Builtin部分.
| 归档时间: |
|
| 查看次数: |
93 次 |
| 最近记录: |