web-dev-qa-db-ja.com

forループ範囲のbash変数

1から100までの数値のリストを出力したいのですが、次のようなforループを使用しています。

number=100
for num in {1..$number}
do
  echo $num
done

コマンドを実行すると、{1..100}のみが出力され、1から100までの番号のリストは出力されません。

13
coffeMug

はい、それは括弧の展開がパラメータ展開の前に発生するためです。 zshや_ksh93_などの別のシェルを使用するか、別の構文を使用します。

標準(POSIX)sh構文

_i=1
while [ "$i" -le "$number" ]; do
  echo "$i"
  i=$(($i + 1))
done
_

Kshスタイルfor ((...))

_for ((i=1;i<=number;i++)); do
  echo "$i"
done
_

evalを使用(推奨されません)

_eval '
  for i in {1..'"$number"'}; do
    echo "$i"
  done
'
_

GNU seqコマンドが使用可能なシステムで使用する

_unset -v IFS # restore IFS to default
for i in $(seq "$number"); do
  echo "$i"
done
_

(新しいコマンドをフォークして実行し、シェルがパイプから出力を読み取る必要があるため、効率が低下します)。

シェルでのループを避けます。

シェルスクリプトでループを使用することは、多くの場合、正しく実行していないことを示しています。

ほとんどの場合、コードは他の方法で記述できます。

19

これにはforループも必要ありません。seqコマンドを使用するだけです。

$ seq 100

印刷される最初の10個の数字は次のとおりです。

$ seq 100 | head -10
1
2
3
4
5
6
7
8
9
10
6
slm

次のものを使用できます。

for (( num=1; num <= 100; num++ ))
do
    echo $num
done
4
unxnut

ブレース展開は、リテラル整数または単一文字に対してのみ機能します。変数展開の前に発生するため、変数を使用できません。

1
choroba

また、事前増分があります。

for (( int=1; int <= 100; ++int));
  do
    printf '%s ' $int
  done

代わりに、printfを使用して、数値を1行に出力します。

2ずつ増加する別の例

for (( int=1; int <= 100; int+=2));
  do
    printf '%s ' $int
  done
1
holasz

Bashスクリプトで単にそれを行う別の方法(そしてそれはあなたがやっていたことのように見えます)

number=100
for num in $(seq 1 $number); do
    echo $num;
done
1
MBR