1から100までの数値のリストを出力したいのですが、次のようなforループを使用しています。
number=100
for num in {1..$number}
do
echo $num
done
コマンドを実行すると、{1..100}のみが出力され、1から100までの番号のリストは出力されません。
はい、それは括弧の展開がパラメータ展開の前に発生するためです。 zsh
や_ksh93
_などの別のシェルを使用するか、別の構文を使用します。
_i=1
while [ "$i" -le "$number" ]; do
echo "$i"
i=$(($i + 1))
done
_
for ((...))
_for ((i=1;i<=number;i++)); do
echo "$i"
done
_
eval
を使用(推奨されません)_eval '
for i in {1..'"$number"'}; do
echo "$i"
done
'
_
seq
コマンドが使用可能なシステムで使用する_unset -v IFS # restore IFS to default
for i in $(seq "$number"); do
echo "$i"
done
_
(新しいコマンドをフォークして実行し、シェルがパイプから出力を読み取る必要があるため、効率が低下します)。
シェルスクリプトでループを使用することは、多くの場合、正しく実行していないことを示しています。
ほとんどの場合、コードは他の方法で記述できます。
これにはforループも必要ありません。seq
コマンドを使用するだけです。
$ seq 100
印刷される最初の10個の数字は次のとおりです。
$ seq 100 | head -10
1
2
3
4
5
6
7
8
9
10
次のものを使用できます。
for (( num=1; num <= 100; num++ ))
do
echo $num
done
ブレース展開は、リテラル整数または単一文字に対してのみ機能します。変数展開の前に発生するため、変数を使用できません。
また、事前増分があります。
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
Bashスクリプトで単にそれを行う別の方法(そしてそれはあなたがやっていたことのように見えます)
number=100
for num in $(seq 1 $number); do
echo $num;
done