下面的脚本有什么作用?

0 bash

下面的脚本有什么作用?

#!/bin/bash

echo $(ls|grep -E "*\.$1$"|wc -l)
Run Code Online (Sandbox Code Playgroud)

ste*_*ver 8

它的目的可能是计算当前目录中带有“点后缀”的文件数,该后缀与作为脚本参数提供的文件匹配。然而,它似乎是由对一些事情感到困惑的人写的:

  • 在正则表达式*开头使用"*\.$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)