Bash Regex比较行不通


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

我试图检查传递的文件扩展的文件扩展,以相对于多个文件扩展名数组。但是,它似乎无法正常工作。有帮助吗?

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

在数组上循环循环以在每个元素上进行正则匹配,这似乎相当低效率。您正在使用Regex;结合表达式并避免循环循环很容易。

将阵列弄脏到有效的正则是完全微不足道的。这是我的尝试:

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

请注意validTypes中的元素现在是如何正式表达式的,dot逃脱仅与字面的点匹配。

最新更新