改行でコマンド出力を分割しますか?

改行でコマンド出力を分割しますか?

複数行を返すコマンドがあります。さらに処理するには、これらの各行を処理する必要があります。

現在のコードは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

IFSを変更せずに複数行出力の1行にアクセスするより良い方法があるかどうか疑問に思います。特にIFSを修正したところ、スクリプトの読みやすさが非常に低下しました。

更新: chorobから次のような回答を受け取るのに苦労しています。

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

私にください

./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 \"""\").

誰でもこの問題を解決するのに役立ちますか?ありがとうございます!

ベストアンサー1

ループreadではどうですか?while

some command returning multiple lines | while IFS= read -r line ; do
    echo "$line"
done

ただし、パイプはサブシェルで実行されるため、スクリプトの残りの部分では変数の値を変更することはできません。 whileループで生き残るために何かが必要な場合は、bashのプロセス置換を使用できます。

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

おすすめ記事