我想所有行從輸入文件複製到另一個文件:如何從指定的文件讀取?
#!/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
命令從我給作爲參數傳遞給腳本文件獲取它的輸入?
我想所有行從輸入文件複製到另一個文件:如何從指定的文件讀取?
#!/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
命令從我給作爲參數傳遞給腳本文件獲取它的輸入?
#!/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"
以上述方式在完成時提供輸入文件。
@LRobert我檢查了它在我的系統上運行。如果您有任何疑問,請告訴我。 –
儘管您已將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!
感謝您解釋詳細信息:) –
您從哪裏閱讀? – grail
您正在使用'>'重定向,它將創建一個新文件'current_file.txt',其內容爲'$ LINE'。如果要在文件中累積行,請使用'>>'而不是'>'。 –
那麼,當我使用'while read LINE'時,LINE不會讀取「in」中的行,其中in中包含文本的文件的名稱 –