如何逐行读取

问题描述 投票:1回答:1

我需要逐行读取变量,对每一行进行一些操作,然后再处理数据。我必须在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

请帮忙。

shell sh
1个回答
2
投票

正如您所猜测的那样,父级看不到子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
  • 最好将变量保持为小写。所有大写都保留给shell变量。
  • 使用IFS=-r来保持read不会剥离前导空格或解释反斜杠。
© www.soinside.com 2019 - 2024. All rights reserved.