Shell-Script

從文件中讀取的文件名沒有得到正確的值

  • December 9, 2016

我有一個腳本,如下。

要處理的文件儲存在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

從錯誤行(': No such file...而不是'filename': No such file...)判斷,問題可能出在您的images.txt文件中,其行以 CR-LF 終止(即images.txt來自 Windows 世界)。

因此,您的line變數(文件名)以CR不正確的(輸入)結尾(沒有這樣的文件……)。此外,當它顯示在螢幕上時,由於嵌入的控製字元CR,列印從行首繼續並覆蓋文件名。

更改 的格式images.txt,使其行以 LF 結尾(dos2unix例如使用實用程序),或過濾掉 bash 中的結尾 CR。

$$ update $$如果您選擇在 bash 中過濾掉 CR,您可以理想地執行以下任一操作:

  • read -r -d $'\r' line
  • 或者,就在read -r lineline=${line%$'\r'}

引用自:https://unix.stackexchange.com/questions/328392