1

Я пишу небольшой скрипт, чтобы вращать все нечетные картинки в каталоге, но я не могу заставить его работать. Вот код

#!/bin/bash

count=1

for picture in `ls -v *.png`
do
    if ["$picture" == "picture_$count.png"]
    then
        mogrify -rotate 90 "$picture"
        count=$(($count+2))
    fi
done

Какие-либо предложения?

4 ответа4

5

Не 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 и ] .

1

Ваш скрипт не работает, потому что в строке 7 вам нужен пробел после [ и один перед ] .
Например:

if [ "$picture" == "picture_$count.png" ]

Кроме того, ваш текущий скрипт работает только до тех пор, пока не пропущены нечетные числа.

0
max=$(ls *.png | sort -n | tail  -1 | xargs basename -s .png)
for f in seq 1 2 $max
do
    mogrify -rotate 90 $f.png
done
0

Наконец я нахожу ошибки в сценарии:

  • Сначала пробел после [ и до ] , прокомментированный здесь и здесь.
  • Во-вторых, благодаря комментариям к моему вопросу о MariusMatutiae и Моисее я меняю строку семь с удаления if ["$picture" == "picture_$count.png"] на if [ $picture == pagina_$count.png ] "

Вот последний сценарий.

#!/bin/bash

count=1

for picture in `ls -v *.png`
do
    if [ $picture == picture_$count.png ]
    then
        mogrify -rotate 90 "$picture"
        count=$(($count+2))
    fi
done

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .