如何从命名文件中读取?

时间:2017-04-03 09:45:38

标签: bash file-io

我试图将输入文件中的所有行复制到另一个文件中:

#!/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命令从我作为脚本参数的文件中获取输入?

2 个答案:

答案 0 :(得分: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"

以上述方式在完成结束时提供输入文件。

答案 1 :(得分: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命令:

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!