通过换行符拆分命令输出?

ste*_*wpf 9 shell bash command-substitution command

我有一个返回多行的命令。为了进一步处理,我需要处理这些行的每一行。

我当前的代码通过修改 IFS(内部字段分隔符)来工作:

ROWS=$(some command returning multiple lines)

O=$IFS #save original IFS
IFS=$(echo -en "\n\b") # set IFS to linebreak

for ROW in ${ROWS[@]}
do
  echo "$ROW"
done

IFS=$O #restore old IFS
Run Code Online (Sandbox Code Playgroud)

我想知道,是否有更好的方法来访问多行输出的单行,而不修改 IFS?特别是通过修改 IFS,我的脚本的可读性变差了。

更新:我很难得到答案,例如来自 choroba 的答案:

while IFS= read -r line ; do
    let var+=line #line 42
done << $(sqlite3 -list -nullvalue NULL -separator ',' /var/log/asterisk/master.db "${QUERY}")
echo "$var" # line 44
Run Code Online (Sandbox Code Playgroud)

给我

./bla.sh: row 44: Warning: here-document at line 43 delimited by end-of-file (wanted `$(sqlite3 -list -nullvalue NULL -separator , /var/log/asterisk/master.db ${QUERY})')
./bla.sh: row 42: let: echo "": syntax error: invalid arithmetic operator. (error causing character is \"""\").
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮助我吗?谢谢!

cho*_*oba 14

怎么样read在一个while循环?

some command returning multiple lines | while IFS= read -r line ; do
    echo "$line"
done
Run Code Online (Sandbox Code Playgroud)

但是请注意,管道在子shell 中运行,这意味着您无法更改脚本其余部分的变量值。如果你需要一些东西从你的 while 循环中存活下来,你可以使用 bash 的进程替换:

while IFS= read -r line ; do
    let var+=line
done < <(some command returning multiple lines)
echo "$var"
Run Code Online (Sandbox Code Playgroud)