【问题标题】:How to do a while loop with a string redirected into it如何使用重定向到其中的字符串进行while循环
【发布时间】:2011-03-11 18:54:54
【问题描述】:

我试图循环一个带有 HTTP 链接和换行符的字符串,我想一次循环一行。

目前有

echo -e "$HTTP_LINKS" | while read HTTP_S_LINK ; do
    TEST_STRING="test"
done

但是这样我就无法访问循环之外的 TEST_STRING,这正是我想要的。 我正在使用 while 循环,以便它循环遍历 $HTTP_LINKS 中的每个换行符,而不仅仅是字符串中的单词。 (我不想使用 IFS 设置为 \n 的 for 循环)

我想也许我可以做这样的事情

#!/bin/bash
while read HTTP_S_LINKS
do   
    TEST_STRING="test2"
done < $HTTP_LINKS

但这当然行不通,因为 $HTTP_LINKS 包含字符串而不是文件链接。

【问题讨论】:

    标签: linux bash newline while-loop delimiter


    【解决方案1】:

    您的第二个片段的想法是正确的,但您需要通过 &lt;&lt;&lt; 语法使用“此处的字符串”。您无法在第一个片段之外访问$TEST_STRING,因为管道创建了一个子外壳;使用here-string 不会。另外,请确保引用 "$HTTP_LINKS" 否则您将丢失换行符。

    #!/bin/bash
    
    HTTP_LINKS=$(echo -e "http://www.aaa.com\nhttp://www.bbb.com")
    
    unset TEST_STRING; 
    
    while read url; 
    do 
        ((TEST_STRING++))
    done <<<"$HTTP_LINKS"
    
    echo $TEST_STRING
    

    输出

    2
    

    【讨论】:

    • 啊,就是这样,一个子外壳。我知道有一个词,我只是忘记了它是什么。所以它是3个重定向,呵呵。谢谢!
    • 你有任何链接可以让我进一步了解 3 个重定向“
    • @Mint:这不是“3 次重定向”,&lt;&lt;&lt; 被称为“这里的字符串”(&lt;&lt; 被称为“这里的文档”)。 Here's a doc on here strings and here docs。并来自manual
    【解决方案2】:

    如果您在循环外初始化并导出 TEST_STRING 变量,您应该可以在循环后访问它。

    【讨论】:

    • 我在循环前完成了 'export TEST_STRING=0' 但 $TEST_STRING 在循环后仍然返回 0。
    • 不需要导出,只是不要使用创建子外壳的构造,也就是管道。
    • 这不是导出的工作方式或它的用途。它用于将变量放入子进程,而不是取出
    猜你喜欢
    • 1970-01-01
    • 2015-10-30
    • 1970-01-01
    • 2020-03-11
    • 2020-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多