次のような単純な BASH コマンドがあります。
for i in `seq 2`; do echo $i; done; > out.dat
これを実行すると、の出力がseq 2
端末に出力され、データ ファイル (out.dat) には何も出力されません。
コマンドを実行するだけのように、標準出力が out.dat にリダイレクトされることを期待していますseq 2 > out.dat
セミコロンを削除します。
for i in `seq 2`; do echo "$i"; done > out.dat
提案
また、Fredrik Pihl によって提案されているように、必要でない場合、または少なくとも実際には必要ない場合は、外部バイナリを使用しないようにしてください。
for i in {1..2}; do echo "$i"; done > out.dat
for ((i = 1; i <= 2; ++i )); do echo "$i"; done > out.dat
for i in 1 2; do echo "$i"; done > out.dat
words
また、パス名の展開を引き起こす可能性のある出力にも注意してください。
for a in $(echo '*'); do echo "$a"; done
リテラルの代わりにファイルを表示します*
。
$()
バッククォート ( ) よりも Bash および POSIX シェルでのコマンド置換のより明確な構文としても推奨され、`
ネストをサポートします。
出力を変数に読み取るためのよりクリーンなソリューションは次のとおりです。
while read var; do
...
done < <(do something)
と
read ... < <(do something) ## Could be done on a loop or with readarray.
for a in "${array[@]}"; do
:
done
printf を使用することは、目的の機能に関してより簡単な代替手段になる場合もあります。
printf '%s\n' {1..2} > out.dat
完全を期すための別の可能性:>>
ファイルが存在する場合は、ファイルに追加するために使用して、出力をループ内に移動できます。
for i in `seq 2`; do echo $i >> out.dat; done;
どちらが優れているかは、ユースケースによって異なります。ファイルを一度に書き込む方が、何千回も追加するよりも確かに優れています。また、ループに複数のecho
ステートメントが含まれていて、そのすべてがファイルに送られる場合は、実行done > out.dat
する方が読みやすく、維持しやすいでしょう。もちろん、このソリューションの利点は、柔軟性が向上することです。
試す:
(for i in `seq 2`; do echo $i; done;) > out.dat