In that code fragment, you set i=0 but fail to increment it, so it looks like an infinite loop...
As to your specific question, consider this:
Code:
$ cat ramsvi
#!/bin/bash
arr=(File_1234.csv File_12sd45rg.csv)
len=${#arr[@]}
echo $len
shopt -s extglob
pattern0=*[0-9]*.*
pattern1=*[0-9]*_[0-9]*.*
pattern2=*[a-zA-z0-9]*.*
pattern3=File_[0-9]*_[0-9]*.csv
pattern4=File_[a-zA-Z]*_[a-zA-Z]*.csv
pattern5=File_[a-zA-Z0-9]*_[a-zA-Z0-9]*.csv
pattern6=File_[0-9]*[a-zA-Z]*.csv
for ((i=0; i<len; ++i))
do
echo ${arr[${i}]}
case ${arr[${i}]} in
(${pattern0}) echo "pattern0 match" ;;&
(${pattern1}) echo "pattern1 match" ;;&
(${pattern2}) echo "pattern2 match" ;;&
(${pattern3}) echo "pattern3 match" ;;&
(${pattern4}) echo "pattern4 match" ;;&
(${pattern5}) echo "pattern5 match" ;;&
(${pattern6}) echo "pattern6 match" ;;
(*) echo "No match.";;
esac
i=$((++${i}))
done
$ bash ramsavi
2
File_1234.csv
pattern0 match
pattern2 match
No match.
File_12sd45rg.csv
pattern0 match
pattern2 match
pattern6 match
So, your question is "Why does pattern2 match in the second case?" But "*" in a bash pattern means "match anything," so
*[0-9]*.* means "match anything containing a number anywhere before a dot" which always matches your file names.
Anyhow, why are you using a shell script for this task? There are several other languages that could, I think, be better used for this problem. (e.g.,
sed,
gawk,
grep, etc.)