Если совсем как в примере то вот:
for i in $(ls *.txt | sed -e 's/\.[a-Az-Z]*$//'); do echo "file name $i.zip"; zip -9 $i.zip $i.txt; done
Если иначе. То нужно командочку подтюнить. Смысл в команде такой.
ls бежит по каталогу и передает в трубе все что найдет с расширением .txt программе редактору sed. Sed по средством регульрных выражений обрежает расширения для того чтобы оставить имена файлов, для их дальнейшего использования.
Все это дело в цикле приводит к тому что в перменную $i подставляется то что выполняется в команде $() в начале строки (это истоки shell). И формируется строка на выполнение.
Тут получается так:
zip -9 1.zip 1.txt
zip -9 2.zip 2.txt
....