繁体   English   中英

如何在bash中逐行读取文本文件

[英]How to portable read a text file line by line in bash

为了逐行处理bash中的文本文件,我通常会实现这样的while循环:

function doSomething() {
    local inputFile="$1"
    local fd=""
    local line=""
    exec {fd}<"$inputFile" # open file
    echo "Opened ${inputFile} for read using descriptor ${fd}"
    while IFS='' read -r -u $fd line || [[ -n "$line" ]]; do
        echo "read = \"$line\""
    done
    exec {fd}<&- # close file
    return 0
}

这适用于我的Linux但不幸的是不在OSX中。 对于OSX,我目前必须将代码更改为:

exec 3<"$inputFile" # open file
while IFS='' read -r -u 3 line || [[ -n "$line" ]]; do
    echo "read = \"$line\""
done
exec 3<&- # close file

但这有一个缺点,我必须自己管理文件描述符号(在第一个脚本中,我让bash选择一个可用的文件描述符号)。

有人有一个适用于Linux和OSX的解决方案吗?

请注意,由于某种原因,我不想像这样使用管道或I / O重定向到完整循环(因为我不想在不同的进程中执行循环):

while IFS='' read -r line || [[ -n "$line" ]]; do
    echo "read = \"$line\""
done < "$inputFile"

最后一个循环不会分叉新进程。 您可以通过在循环内外打印"$BASHPID"来验证。

仅为管道创建新流程。 简单的重定向由bash过程中的临时dup处理。

随意使用标准的stdin / stdout重定向。 它并不比使用exec内置的重定向更昂贵。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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