複数行を返すコマンドがあります。さらに処理するには、これらの各行を処理する必要があります。
現在のコードは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"