如何逐行读取变量

时间:2019-03-28 23:19:42

标签: shell sh

我需要逐行读取变量,对每一行进行一些操作,然后再处理数据。我必须在嘘。

我已经尝试过了,但是$ VAR是空的,因为我假设我将它保存在一个子shell中

#!/bin/sh POSIXLY_CORRECT=yes
STRING="a\nb\nc\n" 
echo $STRING | while read line; do
*some operations with line* 
VAR=$(echo "$VAR$line") 
done 
echo $VAR

我还尝试了重定向变量...

done <<< $STRING
done < $(echo $STRING)
done < < $(echo $STRING)

...等等,但只有No such fileRedirection unexpected

请帮助。

1 个答案:

答案 0 :(得分:2)

您已经猜到了,父级看不到子shell中的变量分配,并且管道中的命令在子shell中运行。

必须以纯文本方式工作是一种真正的嗡嗡声。好的,好的,这里有一些想法。一种是延长子外壳的寿命,并在循环结束后进行工作:

string="a
b
c" 
echo "$string" | {
    var=
    while IFS= read -r line; do
        *some operations with line* 
        var=$var$line
    done 
    echo "$var"
}

另一种方法是使用heredoc(<<),因为sh没有herestrings(<<<)。

var=
while IFS= read -r line; do
    *some operations with line* 
    var=$var$line
done <<STR
$var
STR

其他改进:

  • 转义不是用字符串文字解释的,因此,如果要文字换行符,请输入文字换行符,而不要使用\n
  • 确保使用$var清空var=。您不希望环境变量泄漏到脚本中。
  • 引用变量扩展。不过,作业中不需要。
  • $(echo foo)是反模式:您可以只写foo
  • 最好将变量保持小写。所有大写字母都保留给shell变量使用。
  • 使用IFS=-r来防止read删除前导空白或解释反斜杠。