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
我对 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