2017-06-22 11 views
0

インデックスと値を持つシェルスクリプト内に配列があります。私はこの配列を印刷することができます。配列全体をテキストファイルに書き込むにはどうすればよいですか?私は現在やっている何をシェルスクリプト:最後の行だけでなく、forループの内容全体をファイルに書き出します。

はこれです:

for i in "${!array[@]}"; do 
    printf "%s\t%s\n" "$i" "${array[$i]}" >outfile 
done 

しかし、配列の最後の要素だけがoutfileに存在しています。これをどうすれば解決できますか?私は後でこのコードで再びそれらをやっていないんだけど、彼らが必要だ -

for key in "${!array[@]}"; do 
    value=${array[$key]} 
    [[ $key = *[$'\t\n']* ]] && continue # security: disallow keys with tabs or newlines 
    [[ $value = *[$'\n']* ]] && continue # security: disallow values with newlines 
    printf "%s\t%s\n" "$i" "${array[$i]}" 
done >outfile 

注これらのチェック:

+0

コードは正常に動作します。配列全体をファイルにリダイレクトするにはどうすればいいですか? – venkatsai

+0

*何かを '>'でファイルにリダイレクトするのと同じ方法です。 –

+0

私はそのように指示するとき、それは最後の値を格納するだけです。 – venkatsai

答えて

4

簡単な答えはないprintfに、done後にリダイレクトを置くことですあなたのフォーマットの値が他のキーと値のペアを挿入できるようにするか、あるいは "値"が実際に他のキーを指定できるようにします。言っ


は、一つは原子性を確保するために、書き込みおよびリネームパターンを使用する必要があり、ファイル全体 一度を交換します。一般的なパターンは次のとおりです。 write_your_dataはプレースホルダである必要はない

tempfile=$(mktemp outfile.XXXXXX) 
write_your_data >"$tempfile" 
mv -- "$tempfile" outfile 

- それはまた、ループ自体をカプセル化する機能が考えられます。

write_your_data() { 
    local i 
    for i in "${!array[@]}"; do 
    printf "%s\t%s\n" "$i" "${array[$i]}" 
    done 
} 
2

だけ明確にする、あなただけ見ている理由最後の行は、>>の代わりに>を使用しているためです。

>は、出力をファイルにリダイレクトします。ファイルを作成するか、既に存在していたものを上書きします。

>>も出力をリダイレクトしますが、ファイルに追加します。末尾に追加します。

あなたのforループが繰り返されるたびに、ファイルを「再作成」していました。

for i in "${!array[@]}"; do 
    printf "%s\t%s\n" "$i" "${array[$i]}" >> outfile 
done 
+0

個々の 'printf'呼び出しや' echo'呼び出しで '>>'を使うのは非効率です:ファイルを1回書き直す前に再度開き、後でもう一度閉じます。ファイルを一度だけ開いてそのハンドルを再利用すれば、それは避けられる 'open()'と 'close()'(従って暗黙的に、フラッシュ)の束です。 –

+0

本当に、私は単にOPによって与えられたコードを使って最後の行だけを見ていたのか、彼は望む結果を得るためにコードを非常に簡単に修正できるのかという疑問に答えるだけでした。 – MerrillFraz

関連する問題