我有一个脚本,如下所示。
要处理的文件存储在images.txt
逐行读取的文件中。第一个echo
命令正确显示文件名,但后续 ImageMagick 命令无法处理图像,提示找不到文件。为什么?
#!/bin/bash
filename="images.txt"
while read -r line
do
echo "line is $line"
# width
width="$( identify -format "%w" "$line" )"
# height
height="$( identify -format "%h" "$line" )"
echo "$width X $height "
exit 1
if [ $width -lt 250 -a $height -lt 250 -a $width -lt $height ]
then
echo "1"
convert $line -resize 250 $line
elif [ $width -lt 250 -a $height -lt 250 -a $width -gt $height ]
then
echo "2"
convert $line -resize x250 $line
elif [ $width -lt 250 ]
then
echo "3"
convert $line -resize 250 $line
elif [ $height -lt 250 ]
then
echo "4"
convert $line -resize x250 $line
else
echo "All is Well"
fi
done < "$filename"
输出:
line is v/347/l_ib-dfran035__62594_zoom.jpg
': No such file or directory @ error/blob.c/OpenBlob/2589._zoom.jpg
答案1
从错误行(': No such file...
而不是'filename': No such file...
)判断,问题可能出在您的images.txt
文件中,其行以 CR-LF 终止(即images.txt
来自 Windows 世界)。
因此,您的line
变量(文件名)以CR
(回车符)结尾,这是不正确的(没有这样的文件...)。此外,当它显示在屏幕上时,由于嵌入的控制字符CR
,打印从行的开头继续并覆盖文件名。
更改 的格式images.txt
,使其行以 LF 结尾(dos2unix
例如使用该实用程序),或在 bash 中过滤掉结尾的 CR。
[更新] 如果您选择在 bash 中过滤掉 CR,您最好可以执行以下任一操作:
read -r -d $'\r' line
- 或者,就在
read -r line
:line=${line%$'\r'}