Не ls .
Вместо этого просто дайте оболочке получить все нечетные файлы за вас. Это и безопаснее, и проще:
#!/bin/bash
for picture in *[13579].png
do
mogrify -rotate 90 "$picture"
done
[] в глобусе оболочки соответствует любому одному из символов внутри, поэтому, перечисляя все нечетные цифры, полный шаблон соответствует любому файлу в текущем каталоге, который заканчивается на odd_digit.png. Нет необходимости поддерживать счетчик выполнения, и, поскольку расширение имени файла (т. Е. Глобализация оболочки) - это последнее, что происходит с командной строкой перед ее выполнением, она не будет вызываться именами файлов с прикольными символами.
Что касается конкретной проблемы с вашим исходным сценарием, то, как указано в строке nullterminated , вам нужны пробелы вокруг [ и ] в строке if . Это потому, что [ это не какой-то особый синтаксис для if , это просто другая команда: /bin/[ , которая является синонимом команды test . (Ваша оболочка, вероятно, предоставляет собственную встроенную версию [ из соображений производительности, но она должна вести себя так же, как и внешняя команда, включая все ограничения синтаксического анализа.)
Без пробела между [ и "$picture" вы говорите bash запустить команду с именем что-то вроде [picture_1.png с двумя аргументами: == и picture_1.png] . Поскольку у вас, вероятно , нет команды под названием [picture_1.png на вашем компьютере, ваш скрипт завершается ошибкой.
С пробелами вокруг [ и ] вы будете запускать команду [ с четырьмя аргументами: picture_1.png , == , picture_1.png и ] .