Bash-скрипт не работает со строковой переменной, отлично работает прямо в терминале - PullRequest
1 голос
/ 26 октября 2019

Я относительно новичок в Bash. Я написал скрипт для генерации изображений с помощью утилиты montage из imagemagick, читая список файлов png из текстового файла:

IFS=$'\n'
count=1
for line in `cat pngListGr4`;
do
   montage -tile 4x0 $line $(printf "%03d" $count).png
   ((count=count + 1))
  done
unset IFS 

, где файл pngListGr4 выглядит так:

01.png 02.png 03.png 04.png
05.png 06.png 07.png 08.png
...

Следовательно, я ожидал создать файлы 001.png и 002.png в качестве монтажа файлов 1-4 и 5-8. Но вместо этого я получаю сообщение об ошибке:

montage-im6.q16: отсутствует имя файла изображения `001.png '@ error / montage.c / MontageImageCommand / 1795.

Однако следующий код прекрасно работает в терминале:

$ string_="01.png 02.png 03.png 04.png"
$ montage -tile 4x0 $string_ $(printf "%03d" $count).png

Почему моя подстановка строк в моем bash-скрипте приводит к таким проблемам?

1 Ответ

1 голос
/ 26 октября 2019

Вы устанавливаете IFS на \n, чтобы пытаться читать строки, но это означает, что $string_ больше не будет разрываться в пробелах в вашей команде montage. Лучшее решение - использовать цикл while read, который может как получать строки, так и разбивать их на поля:

count=1
while IFS= read -ra line
do
   montage -tile 4x0 "${line[@]}" "$(printf "%03d" "$count").png"
   ((count++))
done < pngListGr4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...