Как насчет простого:
for file in "$(ls -1 | grep -iE '\.txt|\.py|\.h')";
do
....
done
Другой простой вариант:
find . -maxdepth 1 -iname '*.txt'; find . -maxdepth 1 -iname '*.py'; find . -maxdepth 1 -iname '*.h';
Вы можете оберните find в круглые скобки $() в bash, чтобы получить список.