61

このようなことをすることは可能ですか?

start=1
end=10
echo {$start..$end}
# Ouput: {1..10}
# Expected: 1 2 3 ... 10 (echo {1..10})
4

7 に答える 7

65

bashでは、ブレースの拡張は変数の拡張の前に行われるため、これは直接不可能です。

代わりに、算術forループを使用してください。

start=1
end=10
for ((i=start; i<=end; i++))
do
   echo "i: $i"
done

出力

i: 1
i: 2
i: 3
i: 4
i: 5
i: 6
i: 7
i: 8
i: 9
i: 10
于 2011-05-31T17:42:50.777 に答える
26

の使用を検討する必要がありますseq(1)。evalを使用することもできます。

eval echo {$start..$end}

そしてここにseq

seq -s' ' $start $end
于 2011-05-31T17:24:38.017 に答える
9

あなたは使用する必要がありますeval

eval echo {$start..$end}
于 2011-05-31T17:23:54.337 に答える
9

がない場合はseq、プレーンなforループを使用することをお勧めします

for (( i=start; i<=end; i++ )); do printf "%d " $i; done; echo ""
于 2011-05-31T17:45:05.173 に答える
2

あなたはそれがBASHであると確信していますか?ZSHはこれをあなたが望む方法で処理します。ブレース拡張は変数拡張などの他の拡張タイプの前に行われるため、これはBASHでは機能しません。したがって、別の方法を使用する必要があります。

ブレースと可変拡張を組み合わせる必要がある特別な理由はありますか?おそらく、あなたの問題への異なるアプローチはこれの必要性を取り除くでしょう。

于 2011-05-31T17:56:56.937 に答える
2

私は通常これを行います:

echo `seq $start $end`
于 2011-05-31T17:27:37.520 に答える
0

-s exを使用します:seq -s'' 1 10出力:1 2 3 4 5 6 7 8 9 10

于 2017-08-27T07:17:39.310 に答える