次のbashスクリプトがあります。
#!/bin/bash
upperlim=10
for i in {0..10}
do
echo $i
done
for i in {0..$upperlim}
do
echo $i
done
最初のfor
ループ(いいえupperlim
ループ制御の変数)はうまく機能しますが、2番目のfor
ループ(そしてループ制御の変数upperlim
)はそうではありません。 2番目のfor
ループが正しく機能するように変更する方法はありますか?時間をいただきありがとうございます。
答え1
その理由はbashのイベントシーケンスによるものです。支柱の拡張が発生します。今後変数が展開されます。目標を達成するには、Cスタイルforループを使用する必要があります。
upperlim=10
for ((i=0; i<=upperlim; i++)); do
echo "$i"
done
答え2
組み込み関数のみを使用して独自のスタイルでこれを実行するには、evalを使用する必要があります。
d=12
for i in `eval echo {0..$d}`
do
echo $i
done
しかし、一緒にseq
:
lowerlimit=0
upperlimit=12
for i in $(seq $lowerlimit $upperlimit)
do
echo $i
done
個人的にはseq
。
答え3
POSIX方式
携帯性を重視するならPOSIX規格の例:
i=2
END=5
while [ "$i" -le "$END" ]; do
echo "$i"
i=$(($i+1))
done
出力:
2
3
4
5
状況はいいえPOSIX:
(( ))
USDなし(通常の拡張にもかかわらず)POSIX自体が述べたように。[[
。[
ここでは十分です。また見なさい:https://stackoverflow.com/questions/13542832/bash-if-difference- Between-square-brackets-and-double-square-bracketsfor ((;;))
seq
{start..end}
、上記の変数と一緒に使用することはできません。Bash マニュアルを通して。let i=i+1
:POSIX 7 2. シェルコマンド言語単語は含まれておらず、4.3.42でlet
失敗します。bash --posix
USDが必要かもしれませんが、
i=$i+1
わかりません。POSIX 7 2.6.4 算術拡張説明する:シェル変数の場合Xオプションで、前にプラス記号またはマイナス記号を含め、算術拡張を含む有効な整数定数を形成する値を含め、
"$((x))"
同じ"$(($x))"
値を返す必要があります。$((x+1))
しかし、文字通り拡張がx+1
変数ではないという意味ではありません。
答え4
for i in $(seq ${1:-1} ${2:-10}); do
echo $i
done
i=${1:-1}
while (( $i <= ${2:-10} )); do
echo $i
i=$(($i + 1))
done