The_Mente
The_Mente

Reputation: 45

Bash Regex comparison not working

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

I am trying to check the file extension of a file passed in against an array of multiple file extensions. However it doesn't seem to be working properly. Any help?

Upvotes: 0

Views: 88

Answers (2)

tripleee
tripleee

Reputation: 189317

Looping over the array to do a regex match on each element seems rather inefficient. You're using regex; it's easy to combine the expressions and avoid looping at all.

Mangling the array into a valid regex is not entirely trivial, though. Here's my attempt:

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

Notice how the elements in validTypes are regular expressions now, with the dot escaped to only match a literal dot.

Upvotes: 0

Arjun Mathew Dan
Arjun Mathew Dan

Reputation: 5298

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

Effectively, you could change your if statement to either:

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

or:

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

Upvotes: 1

Related Questions