回答:
printf "%s\n" "${mtches[@]}"
mtchesが空の場合、1行の空行が出力されます。それを説明するには:
{ [ "${#mtches[@]}" -eq 0 ] || printf '%s\n' "${mtches[@]}"; } > file
でbash(ともPOSIXシェル)は、頻繁に使用する位置パラメータ配列をとして"$@"の代わりに、"$*"あなたは特別な理由がない限り、。man bash-セクションArraysからの、通常の配列をサポートするシェルでも同様です。
配列の任意の要素は、$ {name [subscript]}を使用して参照できます。中括弧は、シェルのファイル名展開演算子との競合を避けるために必要です。添え字が「@」または「*」の場合、単語は配列名のすべてのメンバーに展開されます。これらの添え字は、単語が二重引用符で囲まれている場合にのみ異なります。単語が二重引用符で囲まれている場合、$ {name [*]}は各配列メンバーの値がIFS変数の最初の文字で区切られた単一の単語に展開され、$ {name [@]}はnameの各要素を展開します別の言葉に。配列メンバーがない場合、$ {name [@]}は何にも展開されません。二重引用符で囲まれた展開が単語内で発生する場合、最初のパラメーターの展開は元の単語の先頭部分に結合され、最後のパラメーターの展開は元の単語の最後の部分に結合されます。
"${array[*]}"すべての配列要素を文字列に結合する場合にのみ使用します。
${mtches[*]}代わりに使用します。
を使用する場合"${mtches[@]}"、の値は重要ではありません$IFS。bashは配列を複数の引数に分割します。必要なのは、各配列要素がで結合された単一の引数\nです。${mtches[*]}これを達成します。
また、一時的な設定方法として$IFS、次のことができます。
( IFS=$'\n'; echo "${mtches[*]}" > sample1.txt )
そうすれば、それを元に戻すことに煩わされる必要はありません。
printf...
for ENTRY in ${ARRAY[@]}; do
echo $ENTRY
done > outfile
すてきで読みやすく、IFSをいじることを意味するものではありません。また、各行の処理をカスタマイズできることも意味します。