【问题标题】:Hanging bash loop script?挂bash循环脚本?
【发布时间】:2013-09-17 23:18:51
【问题描述】:
varrr=0

while read line
do
    if [ $line -gt 500 -a $line -le 600 ]; then    # for lines 501-600
        echo $line >> 'file_out_${varrr}.ubi'
    fi
done << 'file_in_${varrr}.ubi'

file_in_${varrr}.ubi 是一个大约 1000 行的文本文件。我想将第 501-600 行打印到新文件中。

运行此代码会使我的 Ubuntu 终端在新行上带有 &gt; 符号,就好像我需要键入另一个命令来完成循环一样。我无法弄清楚这个循环有什么问题。好像已经完成了。看看我犯了什么错误?谢谢。

【问题讨论】:

    标签: bash loops while-loop


    【解决方案1】:

    我只会回答您的具体问题:这是因为您使用了 heredoc &lt;&lt; 符号,而不是重定向 &lt;。你的最后一行应该是:

    done < 'file_in_${varrr}.ubi'
    

    (观察&lt;)。

    但是你会意识到你有一些引用问题。所以,你的最后一行应该是:

    done < "file_in_${varrr}.ubi"
    

    (注意 双引号 ")。

    同样,请注意第 6 行中的引用。您应该改为:

    echo "$line" >> "file_out_${varrr}.ubi"
    

    双引号 " 代表file_out_${varrr}.ubi)。

    但是,这将不会像您预期的那样运行......也许会这样做:

    varrr=0
    linenb=0
    while IFS= read -r line; do
        ((++linenb))
        if ((linenb>500 && linenb<=600)); then    # for lines 501-600
            echo "$line" >> "file_out_${varrr}.ubi"
        fi
    done < "file_in_${varrr}.ubi"
    

    希望这会有所帮助!

    【讨论】:

    • 谢谢,是的,我需要一个计数器,以及你指出的引号。
    【解决方案2】:

    如果你只想打印从 501 到 600 的行,为什么不使用下面的呢?

    awk 'NR>=501 && NR<=600' file_in > file_out
    

    awk 'NR==n' myfile 打印文件myfile 的行n。然后,您可以使用我上面写的范围。

    【讨论】:

    • 感谢您的提示,我最终为此使用了 awk :)
    • 很高兴阅读,@brastein!由于您是新来的,请记住,如果您的问题已经解决,您可以将答案标记为已接受。您可以单击答案旁边的复选标记将其从空心切换为绿色。如有任何疑问,请参阅Help Center > Asking
    【解决方案3】:

    您可以简单地使用 sed。它是最简单的工具,比带有测试的 while 循环更干净、更快速。

    varrr=0
    sed -n 501,600p "file_in_${varrr}.ubi" >> "file_out_${varrr}.ubi"
    

    或者

    varrr=0
    sed -n 501,600p "file_in_${varrr}.ubi" > "file_out_${varrr}.ubi"
    

    如果您想覆盖现有数据。

    顺便说一句,循环中的错误是因为您没有使用计数器而是通过行本身比较行号。

    varrr=0
    counter=0
    while read line; do
        (( ++counter ))
        [[ counter -gt 500 && counter -le 600 ]] && echo "$line"
    done < "file_in_${varrr}.ubi" > "file_out_${varrr}.ubi"
    

    值得注意的是,您需要使用 &lt; 而不是 &lt;&lt; 作为输入,并将变量放在双引号而不是单引号中。

    【讨论】:

    • 谢谢,我是 bash 新手,您帮助我了解我需要一个计数器。完全需要。但我会考虑改用 sed 或 awk。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多