Shell-Script
從文件中讀取的文件名沒有得到正確的值
我有一個腳本,如下。
要處理的文件儲存在
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 line
:line=${line%$'\r'}