繁体   English   中英

Bash while循环,逐行读取文件

[英]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命令那样的补码开关。

您的脚本中几乎没有错误。

  1. $和变量名之间的空格。 (可能是编辑错误)
  2. echo-e之间的空间。 (可能是编辑错误)
  3. 在文件打开的文件描述符中提及读取。 您正在读取描述符0处的文件,而exec正在描述符3处运行。

它应该是这样的 -

#!/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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM