Я думаю, что могу решить вашу проблему довольно простым способом. 
Я не хочу использовать не встроенные функции:
unset i
rm *.txtx
# Now it is sure no matching file is in this dir
while a=(*.txtx) [ ! -e "$a" ]; do
   echo loop $i; 
   [ $((++i)) -eq 5 ] && >a.txtx # Creates a matching file if i == 5
done
ls *.txtx
Выход:
loop
loop 1
loop 2
loop 3
loop 4
loop 5
a.txtx
Недостаточно проверить размер массива, так как если нет файла, соответствующего шаблону, то размер массива будет равен 1, содержащему шаблон *.txtx . Но может существовать файл с именем *.txtx , поэтому необходимо использовать -e , чтобы проверить, является ли результат просто шаблоном или реальным файлом.
Если в цикле создано больше подходящих файлов, оно все равно работает, так как $a совпадает с ${a[0]} .
Надеюсь, это поможет!