2017-04-03 86 views
0

我想所有行從輸入文件複製到另一個文件:如何從指定的文件讀取?

#!/bin/bash 
in=$1 
file="current_line.txt" 
let count=0 
echo $count 
while read LINE 
do 
     ((count++)) 
     echo $count 
     echo $LINE > $file 
done 

爲什麼不read命令從我給作爲參數傳遞給腳本文件獲取它的輸入?

+1

您從哪裏閱讀? – grail

+1

您正在使用'>'重定向,它將創建一個新文件'current_file.txt',其內容爲'$ LINE'。如果要在文件中累積行,請使用'>>'而不是'>'。 –

+0

那麼,當我使用'while read LINE'時,LINE不會讀取「in」中的行,其中in中包含文本的文件的名稱 –

回答

0
#!/bin/bash 

in=$1 
file="current_line.txt" 
count=0 
echo $count 

while read -r LINE 
do 
     echo $LINE >> $file 
     count=$((count + 1)) 
     echo $count 


done < "$in" 

以上述方式在完成時提供輸入文件。

+0

@LRobert我檢查了它在我的系統上運行。如果您有任何疑問,請告訴我。 –

0

儘管您已將in變量設置爲指向您的輸入文件,但您還沒有做任何處理。內置的read將從它的標準輸入中讀取,它將被繼承,所以如果它沒有在任何時候重定向,一直回到你調用它的終端(或終端模擬器)shell會話。

您可以重定向腳本的標準輸入,不管是你調用它,或者通過

exec <"$in" 
while read LINE 
do 
    # ... 
done 

如果你想在以後恢復標準輸入,你需要將它保存到一個未使用的描述符(但更喜歡接下來的選擇,因爲它更簡單):

exec 3<&0 <"$in" 
while read LINE 
do 
    # ... 
done 
exec <&3 # to restore input 

或者,你可以重定向只是while循環從$in閱讀:

while read LINE 
do 
    # ... 
done <"$in" 

另一種選擇是奉獻文件描述符到您的輸入,並使用read -u使用,對您的read命令:當你分配給in

exec 3<"$in" 
while read -u 3 LINE 
do 
    # ... 
done <"$in" 

exec 3<&- # to close the file neatly 

順便說一句,要小心引述來自不受控制的用戶輸入來的$1值:

in="$1" 

還要注意,每個echo $LINE覆蓋$file,所以當腳本結束時你只能看到輸入的最後一行。考慮重定向整個while循環的輸出,就像重定向輸入一樣,如果這不是你想要的。例如:

while read LINE 
do 
    # ... 
    echo "$LINE" # Note the quoting (unless you actually intend to collapse whitespace) 
done <"$in" >"$file" # and here! 
+0

感謝您解釋詳細信息:) –

相關問題