8

seq番号が変数の場合、Bashの組み込みシーケンス(つまり、seqを使用しない)に問題があります。たとえば、これは機能し、私を印刷します1 2 3:

for i in {1..3};do
  echo $i
done

でも、これ :

a=3
for i in {1..$a};do
   echo $i
done 

失敗して私を印刷する{1..3}のみ

これはZSHで機能し、カウンターを作成するための代替手段があることはわかっていますが、これがバグなのかブレース拡張機能なのか疑問に思っています。

4

7 に答える 7

5

Bashでは、変数拡張の前にブレース拡張が実行されます。注文については、シェル拡張を参照してください。

$ a=7; echo {1..3} {4..$a}
1 2 3 {4..7}

変数を使用する場合はfor、Shawnの回答のようにCスタイルのループを使用してください。

于 2011-02-10T16:19:48.837 に答える
4

別の方法は、Cスタイルのループを可能にする二重括弧構造を使用することです。

A=3
for (( i=1; i<=$A; i++ )); do
    echo $i
done
于 2011-02-10T11:39:35.497 に答える
3
$ num=3
$ for i in $( eval echo {1..$num});do echo $i;done
1
2
3
于 2011-02-10T11:38:45.803 に答える
2
    #!/bin/bash - see comment for list of obsolete bash constructs
    function f_over_range {
        for i in $(eval echo {$1..$2}); do
            f $i
        done
    }

    function f {
        echo $1
    }

    #POSIX-compliant
    f_over_range() {
        for i in $(eval echo {$1..$2}); do
            f $i
        done
    }

    f() {
        echo $1
    }


    f_over_range 0 5
    f_over_range 00 05

ノート:

  • evalを使用すると、コマンドインジェクションのセキュリティリスクが明らかになります
  • Linuxは「00\n01 \ n02..etc」を出力しますが、OSXは「0 \ n1 \ n2 \ n...etc」を出力します
  • seqまたはCスタイルのforループを使用しても、中括弧の展開による先行ゼロの処理とは一致しません。
于 2018-08-24T19:24:25.743 に答える
1

他のオプションは、seqコマンドを使用することです。

a=3; for i in $(seq 1 $a);do echo $i;done
于 2016-02-17T20:54:49.833 に答える
0

私はまた、次のようなことをする必要がありました:

n=いくつかの数; {1 .. $ n..increment}

だから私はこの回避策を使用しました:

n=100  
i=1
while [ $i -lt $n ]
do
echo $i
i=$(( $i+1 ))
done
于 2017-11-05T08:01:17.427 に答える
-1

これを試して:

$ start=3
$ end=5
$ echo {$(echo $start)..$(echo $end)}
于 2016-06-23T02:51:23.783 に答える