Bash Regex比较不起作用

时间:2017-04-19 03:59:59

标签: regex bash

keyFileName=$1;
for fileExt in "${validTypes[@]}"
 do
   echo $fileExt;
   if [[ $keyFileName == *.$fileExt ]]; then
       keyStatus="true";
   fi
done;

我正在尝试检查针对多个文件扩展名数组传入的文件的文件扩展名。然而,它似乎没有正常工作。有什么帮助吗?

2 个答案:

答案 0 :(得分:1)

validTypes=(".txt" ".mp3")
keyFileName="$1"
for fileExt in "${validTypes[@]}"
 do
   echo $fileExt;
   if [[ $keyFileName =~ ^.*$fileExt$ ]]; then
       keyStatus="true";
       echo "Yes"
   fi
done;

实际上,您可以将if语句更改为:

if [[ $keyFileName == ?*$fileExt ]]   # Glob pattern case, ? denotes single char

或:

if [[ $keyFileName =~ .*$fileExt ]]   # Regex case, . denotes single char

答案 1 :(得分:0)

循环数组以对每个元素进行正则表达式匹配似乎效率很低。你正在使用正则表达式;很容易将表达式组合在一起并避免循环。

将数组迁移到有效的正则表达式并不是完全无关紧要的。这是我的尝试:

validTypes=('\.txt' '\.mp3')
fileExtRe=$(printf '|%s' "${validTypes[@]}"
# Trim off the first alternation, add parens and anchor
fileExtRe="(${fileExtRe#?})$"
if [[ $keyFileName =~ $fileExtRe ]]; then
    :

注意validTypes中的元素现在是正则表达式,点转义只与文字点匹配。

相关问题