2017-04-19 28 views
0
keyFileName=$1; 
for fileExt in "${validTypes[@]}" 
do 
    echo $fileExt; 
    if [[ $keyFileName == *.$fileExt ]]; then 
     keyStatus="true"; 
    fi 
done; 

我试图检查一个文件扩展名的文件传递对多个文件扩展名的数组。但它似乎没有正常工作。任何帮助?Bash正则表达式比较不起作用

+0

哪部分似乎不能正常工作? –

+0

keyFileName == *。$ fileExt –

回答

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 
+0

的比较感谢它的作品我错误的东西 –

0

循环数组做每个元素的正则表达式匹配上也显得十分低效。你正在使用正则表达式;很容易组合表达式并避免循环。尽管如此,将数组转换为有效的正则表达式并不是完全微不足道的。这里是我的尝试:

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

注意在validTypes元素如何是正则表达式现在,用点逃到只匹配一个点。