簡體   English   中英

如何讀取命名文件?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM