0 bash
下面的脚本有什么作用?
#!/bin/bash
echo $(ls|grep -E "*\.$1$"|wc -l)
Run Code Online (Sandbox Code Playgroud)
它的目的可能是计算当前目录中带有“点后缀”的文件数,该后缀与作为脚本参数提供的文件匹配。然而,它似乎是由对一些事情感到困惑的人写的:
在正则表达式*
的开头使用"*\.$1"
并没有真正的意义。在 BRE 中,*
没有任何前面的原子是文字,大概作者发现添加-E
使它成为匹配零个或多个空字符串实例的量词。无论哪种方式它都是多余的,并且 grep 可以简单地写成grep "\.$1$"
没有必要wc
因为grep -c
可以计算匹配的行
无需捕获 grep/wc 的输出,然后使用 echo 打印您刚刚捕获的内容。
所以你可以把它改成
#!/bin/bash
ls|grep -c "\.$1$"
Run Code Online (Sandbox Code Playgroud)
然而,ls
以这种方式grep 输出是不好的做法。尤其是,Linux 文件名可能包含换行符,从而忽略计数。更好的方法是直接使用文件名扩展(又名“globbing”),例如
#!/bin/bash
shopt -s nullglob
files=( *."$1" )
echo ${#files[@]}
Run Code Online (Sandbox Code Playgroud)