我试图将输入文件中的所有行复制到另一个文件中:
#!/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
命令从我作为脚本参数的文件中获取输入?
答案 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!