配列の内容をファイルに入れ、配列の各要素をファイルの新しい行に配置しようとしています。
IFS=$'\n'
echo "${mtches[@]}" > sample1.txt
mtchesの内容は「qwe」と「asd」です。ただし、ファイルは1行にsample1.txt
含まれています。qwe asd
IFSの価値を考慮しないのはなぜですか?
ベストアンサー1
printf "%s\n" "${mtches[@]}"
空の場合はmtches
空行が出力され続けます。これを検討してください:
{ [ "${#mtches[@]}" -eq 0 ] || printf '%s\n' "${mtches[@]}"; } > file
(およびPOSIXシェル)ではbash
よく使用されます。位置パラメータ配列特別な理由がない限り、"$@"
代わりに使用してください。"$*"
サポートされているシェルでも同様です。man bashの一般的な配列 - 配列セクション:
$ {name [subscript]}を使用して、配列内のすべての要素を参照できます。シェルのファイル名拡張演算子との競合を防ぐには、中かっこが必要です。下付き文字が「@」または「*」の場合、単語は配列名のすべてのメンバーに展開されます。これらの下付き文字は、単語が二重引用符で囲まれている場合にのみ異なります。単語が二重引用符で囲まれている場合、${name[*]} は IFS 変数の最初の文字で区切られた各配列メンバーの値を使用して単一の単語に展開され、${name[@]} は各単語を拡張します。します。名前要素を別の単語に変換します。配列メンバーがない場合、$ {name [@]}は空の状態に展開されます。単語内で二重引用符拡張が発生すると、最初の引数の拡張は元の単語の先頭に関連付けられ、最後の引数の拡張は元の単語の最後の部分に関連付けられます。これは特殊パラメータ「@」と「*」の拡張に似ています。
"${array[*]}"
すべての配列要素を文字列に連結したい場合にのみ使用してください。