从文件读取的文件名未获得正确的值

从文件读取的文件名未获得正确的值

我有一个脚本,如下所示。

要处理的文件存储在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 lineline=${line%$'\r'}

相关内容