3

for ループの数字で変数を使用するにはどうすればよいですか?

例えば:

num="12"
for i in {0..$num}; do
        ...
done
4

2 に答える 2

6

変数を使用したブレース展開は、期待どおりに機能しません (詳細については、付録 Bを参照してください)。つまり、数値のリストではなく文字どおり{0..$num}しか返されません。{0..12}

seq代わりに次のようにしてみてください。

num="12"
for i in $(seq 0 $num); do
    echo $i
done

付録 B: ジューシーな詳細

バッシュのマニュアルによると、

展開の順序は、ブレース展開、チルダ展開、パラメーター、変数、および算術展開とコマンド置換 (左から右に行われる)、単語分割、およびファイル名展開です。

シェルが展開{0..$num}(ブレース展開) された時点で$numは、まだ展開されていません (変数展開)。シーケンス式は、シーケンスを生成するために と の両方a..bが数値である必要がありますが、ここでは 1 つの数値と 1 つの非数値 (リテラル string ) があります。これに失敗すると、シェルは文字どおりの解釈にフォールバックします。その後、変数展開が引き継がれ、最終的にab$num{0..$num}{0..12}

于 2013-06-27T02:49:24.243 に答える
2

Bash変数展開の前にブレース展開 を行うため、 のような出力が得られます。を使用すると、それを機能させることができます。 {1..12}eval

テスト:

$ num=5
$ for i in {1..$num}; do echo "$i"; done
{1..5}
$ for i in $(eval echo {1..$num}); do echo "$i"; done
1
2
3
4
5

注意: 変装したevalです。

于 2013-06-27T03:31:25.213 に答える