有两种方法可以逐行读取文件,我想在这里讨论:
#!/bin/bash
while read line
do
echo-e "$ line \ n"
done <file.txt
和
#!/bin/bash
exec 3<file.txt
while read line
do
echo-e "$ line \ n"
done
所以第一个版本工作正常,但我不理解使用该文件循环工作的机制。但我理解的第二个版本的机制。但在这里我不明白它为什么会挂起来并且不打印任何东西。
答案 0 :(得分:9)
第一个循环有效,因为done
之后的重定向适用于整个循环,因此read
有来自文件的读取,而不是来自脚本的标准输入。
第二个版本挂起,因为read
从文件描述符0读取,这是标准输入,并且您没有在那里键入任何内容。 exec
行重定向文件描述符3以便从文件中读取,但您不是从文件描述符3中读取。
您可以使用以下方法拯救第二个:
exec <file.txt
现在从命名文件中读取标准输入。
答案 1 :(得分:4)
这可能对您有用:
exec 3<file.txt
while read -u3 line
do
echo -e "$line \n"
done
-u3
从文件描述符3中读取
奇怪echo
没有像ksh的print
命令那样的补码开关。
答案 2 :(得分:3)
您的脚本中几乎没有错误。
$
和变量名之间的空格。 (可能不好编辑)echo
和-e
之间的空格。 (可能不好编辑)它应该是这样的 -
#!/bin/bash
exec 3<file.txt
while read line
do
echo -e "$line \n"
done <&3
答案 3 :(得分:0)
-u3非常适合我的目的(只阅读以下内容)
#!/bin/bash
logs=(*Logs.txt)
[[ -e "${logs[0]}" ]] || exit 0
exec 3<"${logs[0]}"
while read -u3 line
do
if [[ $(echo "$line"| grep -c SCSI_STATUS_CHECK_CONDITION) -eq 1 ]]; then
read -u3 line
echo "$line"
fi
done