Bash while循环,逐行读取文件

时间:2011-12-20 06:16:34

标签: bash file-io while-loop

有两种方法可以逐行读取文件,我想在这里讨论:

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

所以第一个版本工作正常,但我不理解使用该文件循环工作的机制。但我理解的第二个版本的机制。但在这里我不明白它为什么会挂起来并且不打印任何东西。

4 个答案:

答案 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)

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

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

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