forループ範囲内のbash変数

forループ範囲内のbash変数

1から100までの数字のリストを印刷したいです。次の for ループを使用します。

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

コマンドを実行すると、1から100までの数値リストの代わりに{1..100}のみが印刷されます。

答え1

はい、中かっこ拡張がパラメータ拡張の前に発生するためです。zshorなどの他のシェルを使用する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
'

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

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

(このコマンドは新しいコマンドを分岐して実行し、シェルがパイプから出力を読み取る必要があるため効率が悪くなります。)

シェルでループを避けてください。

シェルスクリプトでループを使用することは、通常、ループが正しく実行されないことを示します。

ほとんどの場合、コードを別の方法で書くことができます。

答え2

forループも必要ありませんseq。以下を使用してください。

$ seq 100

はい

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

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

答え3

以下を使用できます。

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

答え4

中括弧拡張は、リテラル整数または単一文字でのみ機能します。変数が拡張される前に発生するため、変数内では使用できません。

関連情報