我需要逐行读取变量,对每一行进行一些操作,然后再处理数据。我必须在嘘。
我已经尝试过了,但是$ 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 file
或Redirection unexpected
请帮助。
答案 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
。IFS=
和-r
来防止read
删除前导空白或解释反斜杠。