62

次のような単純な BASH コマンドがあります。

for i in `seq 2`; do echo $i; done; > out.dat

これを実行すると、の出力がseq 2端末に出力され、データ ファイル (out.dat) には何も出力されません。

コマンドを実行するだけのように、標準出力が out.dat にリダイレクトされることを期待していますseq 2 > out.dat

4

3 に答える 3

89

セミコロンを削除します。

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
于 2013-09-04T11:31:12.603 に答える
8

完全を期すための別の可能性:>>ファイルが存在する場合は、ファイルに追加するために使用して、出力をループ内に移動できます。

for i in `seq 2`; do echo $i >> out.dat; done;

どちらが優れているかは、ユースケースによって異なります。ファイルを一度に書き込む方が、何千回も追加するよりも確かに優れています。また、ループに複数のechoステートメントが含まれていて、そのすべてがファイルに送られる場合は、実行done > out.datする方が読みやすく、維持しやすいでしょう。もちろん、このソリューションの利点は、柔軟性が向上することです。

于 2013-09-04T11:37:10.767 に答える
6

試す:

(for i in `seq 2`; do echo $i; done;) > out.dat
于 2013-09-04T11:29:30.347 に答える