Bash 脚本无法使用字符串变量,直接在终端中运行良好

Bash script not working with string variable, runs fine in directly in terminal

我对 Bash 比较陌生。我编写了一个脚本来使用 imagemagick 的 montage 实用程序生成图像蒙太奇,方法是从文本文件中读取 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: missing an image filename `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 脚本中的字符串替换会出现此类问题?

您正在将 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