我需要逐行读取变量,对每一行进行一些操作,然后再处理数据。我必须在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 file
或Redirection unexpected
请帮忙。
正如您所猜测的那样,父级看不到子shell中的变量赋值,并且管道中的命令在子shell中运行。
必须以朴素的方式工作是一个真正的buzzkill。好吧,好吧,这里有一些想法。一个是延长子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
不会剥离前导空格或解释反斜杠。