
配列の内容をファイルに入れ、配列の各要素をファイルの新しい行に配置しようとしています。
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[*]}"
すべての配列要素を文字列に連結したい場合にのみ使用してください。
答え2
代わりに使用したいです${mtches[*]}
。
bashを使用すると、"${mtches[@]}"
値が何であれ、配列を$IFS
複数の引数に分割します。必要なのは、各配列要素が結合されるパラメータです\n
。${mtches[*]}
これを達成してください。
または、一時設定で$IFS
次のことを実行できます。
( IFS=$'\n'; echo "${mtches[*]}" > sample1.txt )
これにより、あえてリセットする必要がなくなります。
答え3
使用~のため:
for each in "${alpha[@]}"
do
echo "$each"
done
使用歴史;値に以下が含まれると失敗します!
。
history -p "${alpha[@]}"
使用基本名;値に以下が含まれると失敗します/
。
basename -a "${alpha[@]}"
使用シェン;結果が順番に表示されないことがあります。
shuf -e "${alpha[@]}"
答え4
for ENTRY in ${ARRAY[@]}; do
echo $ENTRY
done > outfile
きれいで読みやすく、IFSを台無しにする意図はありません。これはまた、各行の処理をカスタマイズできることを意味します。