计算与bash中的正则表达式匹配的文件名

时间:2017-03-27 14:57:06

标签: bash

我有以下脚本

setup=`ls ./test | egrep 'm-ha-.........js'`
regex="m-ha-(........)\.js"

if [[ "$setup" =~ $regex ]]
then
    checksum=${BASH_REMATCH[1]}
fi

我注意到if [[ "$setup" =~ $regex ]]返回与BATCH_REMATCH中的正则表达式匹配的第一个文件。

有没有办法测试有多少文件与正则表达式匹配?如果有多个文件与正则表达式匹配,我想返回错误。

1 个答案:

答案 0 :(得分:4)

您不需要正则表达式或ls

matches=(./test/m-ha-????????.js)
[[ ${#matches[*]} -gt 1 ]] && echo "More than one."

我们将通配符扩展为数组并检查数组中的元素数。

如果要删除前缀,${match[0]#mh-a-}将返回删除前缀的第一个元素。 %插值运算符类似地删除后缀,例如${match[0]%.js}。你不能同时从两端剥离,但你可以循环匹配:

for match in "${matches[@]%.js}"; do
    echo "${match#./test/m-ha-}"
done

请注意,如果没有匹配项,则数组不会为空,除非您明确设置了nullglob选项。