【问题标题】:bash - loop through file contents and append to stringbash - 遍历文件内容并附加到字符串
【发布时间】:2020-12-06 17:05:22
【问题描述】:

在我的 bash 脚本中,我想读取文件的内容并通过循环将文件的每一行附加到一个空字符串。这似乎很容易做到,我认为我已经根据 SO 上的其他一些帖子(如Concatenate inputs in string while in loop)正确地实现了它,但最终结果似乎仍然是一个空字符串。我显然做错了什么,但我对 bash 脚本不是很有经验,所以我可以快速动手。

我的 bash 脚本:

#!/bin/bash

SOME_STRING=""

cat .env | while read line
do
  SOME_STRING+="$line"
done

echo "$SOME_STRING"

以及它引用的@​​987654323@ 文件:

FOO=bar
BAZ=bim

我希望输出为FOO=barBAZ=bim,但它只是写入一个空字符串。如果我在循环内扔一个echo "$SOME_STRING",我确实看到字符串按预期建立。

我将假设这与我读取文件内容和/或循环遍历文件的方式有关 - 例如,我尝试了 for/in 循环遍历空格- 分隔字符串而不是 while 循环遍历文件内容,效果很好。

非常感谢!

【问题讨论】:

    标签: bash


    【解决方案1】:

    通过将读取循环放在管道中,您可以在子进程中构建字符串。相反,请执行以下操作:

    #!/bin/bash
    
    some_string=""
    
    while read line; do 
        some_string+="$line"
    done < .env
    
    echo "$some_string"
    

    但是,真的,不要这样做。相反,这样做:

    some_string=$(tr -d \\n < .env)
    

    值得注意的是,有时您希望保留子流程,但您需要注意变量将在流程结束时丢失其值。但有时这样做非常方便:

    #!/bin/bash
    
    some_string=""
    
    cmd | {
        while read line; do 
            some_string+="$line"
        done 
        echo "in pipe, some_string=$some_string"
    }
    echo "after pipe, some_string=$some_string"
    

    【讨论】:

    • 成功了!谢谢,威廉。由于对 shell 脚本的经验很少,我不熟悉这将在子进程中处理它的事实。很好的学习,非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 2016-07-21
    • 2012-11-16
    • 2012-07-02
    • 2020-12-28
    • 1970-01-01
    相关资源
    最近更新 更多