[英]How do I read from a named file?
我正在嘗試將所有行從輸入文件復制到另一個文件:
#!/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"
以上述方式在完成時提供輸入文件。
盡管已將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
命令:
exec 3<"$in"
while read -u 3 LINE
do
# ...
done <"$in"
exec 3<&- # to close the file neatly
順便說一句,當您分配給in
,請小心引用來自不受控制的用戶輸入的$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!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.