2014-03-27 50 views
3

這是我的代碼逐行讀取文件行:爲什麼在讀取文件時剪切變量?

IFS=$'\n' 
myfile="$1" 
i=0 
while read line; do 
    echo "Line # $i: '$line'" 
    let i++ 
done < "$myfile" 

這是

Hello 
stack 
overflow 
friends 

我執行它像這樣作爲參數傳遞的文件:test.sh input.txt,我得到這樣的結果:

'ine # 0: 'Hello 
'ine # 1: 'stack 
'ine # 2: 'overflow 
'ine # 3: 'friends 

正如您所看到的,fisrt字符被替換爲一個引號。並沒有出現最後一行的報價。這裏發生了什麼?我看不到錯誤?任何想法?

+0

什麼操作系統?它工作正常W/O在OSX上砍我。可能是IFS解釋的問題。你嘗試沒有這條線嗎? – beroe

+0

它可能與$ line的單引號有關。 – mahatmanich

回答

5

您的輸入文件最可能在行尾有\r

您可以通過使用測試相同:

cat -vte file 

這將在文件末尾顯示^M$有DOS回車\r

你可以使用這個腳本來正確讀取文件:

i=1 
while IFS=$'\r' read -r line; do 
    echo "Line # $i: '$line'" 
    let i++ 
done < "$myfile" 

或他人使用您的文件轉換成UNIX文件:

dos2unix file 

或者如果你不希望實際保存文件剝離\r,您還可以使用:

while read line; do 
........# your code as-is 
done < <(tr -d '\r' < "$myfile") 
+0

當然。我忘了那一個。 :^) – beroe

+0

我使用您發佈的cat命令在每行末尾看到一個'^ M $'。 – harrison4

+1

正確'^ M'的意思是'\ r',用我提供的腳本來讀取文件。 – anubhava

相關問題