以下脚本起什么作用?
#!/bin/bash
echo $(ls|grep -E "*\.$1$"|wc -l)
答案1
它是意图可能是计算当前目录中带有“点后缀”的文件数,这些文件与作为脚本参数提供的文件数相匹配。然而,它似乎是由对以下几件事感到困惑的人编写的:
使用
*
在开始正则表达式的这个部分"*\.$1"
实际上没有任何意义。在 BRE 中,*
没有任何前置原子是字面意思,大概作者发现添加后,-E
它就变成了一个量词,可以匹配零个或多个空字符串实例。无论哪种方式,它都是多余的,grep 可以简单地写成grep "\.$1$"
没有必要
wc
因为grep -c
可以计算匹配的行无需捕获 grep/wc 的输出,然后使用 echo 打印刚刚捕获的内容。
所以你可以把它改成
#!/bin/bash
ls|grep -c "\.$1$"
ls
但是,用这种方式抓取输出是不好的做法。特别是,Linux 文件名可能包含换行符,从而影响计数。更好的方法是直接使用文件名扩展(又称“通配符”),例如
#!/bin/bash
shopt -s nullglob
files=( *."$1" )
echo ${#files[@]}