我有以下脚本
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中的正则表达式匹配的第一个文件。
有没有办法测试有多少文件与正则表达式匹配?如果有多个文件与正则表达式匹配,我想返回错误。
答案 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
选项。