bashの新しい行に配列の各要素がある配列をファイルに印刷する


13

配列の各要素をファイルの新しい行に入れて、配列の内容をファイルに入れようとしています。

IFS=$'\n'   
echo "${mtches[@]}" > sample1.txt 


mtchesの内容は「qwe」および「asd」です。ただし、sample1.txtファイルにqwe asdは1行が含まれています。なぜIFSの価値を考慮していないのですか?

回答:


16

代わりに使用printfechoする必要があります

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[*]}"すべての配列要素を文字列に結合する場合にのみ使用します。


それはどのように違いをもたらしますか?
アシュウィン14


7

${mtches[*]}代わりに使用します。

を使用する場合"${mtches[@]}"、の値は重要ではありません$IFS。bashは配列を複数の引数に分割します。必要なのは、各配列要素がで結合された単一の引数\nです。${mtches[*]}これを達成します。

また、一時的な設定方法として$IFS、次のことができます。

( IFS=$'\n'; echo "${mtches[*]}" > sample1.txt )

そうすれば、それを元に戻すことに煩わされる必要はありません。


pubs.opengroup.org/onlinepubs/9699919799/utilities/…<-POSIXリファレンス(これはbashにのみ適用されません)。
マット14

または使用printf...
jasonwryan

2

forの使用:

for each in "${alpha[@]}"
do
  echo "$each"
done

履歴を使用します。値に次が含まれている場合、これは失敗します!

history -p "${alpha[@]}"

basenameを使用します。値に次が含まれている場合、これは失敗します/

basename -a "${alpha[@]}"

shufを使用します。結果が順番に出ない場合があることに注意してください。

shuf -e "${alpha[@]}"

1
for ENTRY in ${ARRAY[@]}; do
    echo $ENTRY
done > outfile

すてきで読みやすく、IFSをいじることを意味するものではありません。また、各行の処理をカスタマイズできることも意味します。


1
しかしecho、任意のコンテンツには使用できず、変数を引用するの忘れているので、間違っています。わずかに優れたバージョンが既にStevenPennyによって投稿されました
ステファンシャゼラス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.