[英]Bash while loop that reads file line by line
有两种方法可以逐行读取文件,我想在这里讨论:
#!/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
所以第一个版本工作正常,但我不明白循环文件的工作机制。 但我理解的第二个版本的机制。 但在这里,我不明白为什么它挂起,不打印任何东西。
第一个循环有效,因为done
后的重定向适用于整个循环,因此read
是从文件读取,而不是从脚本的标准输入读取。
第二个版本挂起,因为read
的文件描述符0,这是标准输入读取,你也没有录入任何那里。 exec
行重定向文件描述符3以便从文件中读取,但是您不是从文件描述符3中读取。
你可以使用以下方法来拯救第二个
exec <file.txt
现在从命名文件中读取标准输入。
这可能对你有用:
exec 3<file.txt
while read -u3 line
do
echo -e "$line \n"
done
-u3
从文件描述符3中读取
奇怪的是, echo
没有像ksh的print
命令那样的补码开关。
您的脚本中几乎没有错误。
$
和变量名之间的空格。 (可能是编辑错误) echo
和-e
之间的空间。 (可能是编辑错误) 它应该是这样的 -
#!/bin/bash
exec 3<file.txt
while read line
do
echo -e "$line \n"
done <&3
-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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.