だから私は私が呼ぶもの(公式名であるかどうかはわかりません)を「カウンター」にし、基本的に特定の範囲や数字に関連する作業をするのに慣れています。
#!/bin/bash -x
get_total2=$(echo "$@")
while [ $get_total2 -gt 0 ]; do
echo $get_total2
get_total2=$(expr $get_total2 - 1)
done
echo
使用例
しかし、コードが示すように、これは「通常の」カウンタ(通常の順序と同様)ではなく逆カウンタです...私はこれを行う方法を決して理解していません。これは簡単だと確信していますが、単に過度に考えるだけです。
上記のコードを逆順ではなく「一般」計算として機能させるにはどうすればよいですか?
答え1
for
ループを使用してbashから計算できます。たとえば、次のことを考えてみましょう。
#!/bin/bash -x
total="${1}"
for ((i = 0; i < total; ++i)); do
echo "${i}"
done
実行すると、次のような結果が得られます。
$ ./ex.sh 3
0
1
2
$
ループfor
は次のように構成されています。
for ((init; condition; update))
- この
init
部分はループが始まり、変数を初期化する前に一度実行されます。 condition
このセクションはループを通過するたびに評価されます。条件が次の場合、false
ループは停止します。update
このセクションはループを通過するたびに評価されます。++i
短い形式ですi = i + 1
この場合、屋根ふきを通して次の一連のステップが得られます。
i = 0
0 < 3
->正しいecho 0
++i
(i = i + 1
)#iは1になります1 < 3
->正しいecho 1
++i
(i = i + 1
)#iは2になる- '2<3`->真
echo 2
++i
(i = i + 1
)#私は3になる3 < 3
-> false # ループが終了します。
答え2
ここには4つのオプションがあります。最初の2つはbash用で、1つは下に1つは上です。
次の2つのループはPOSIX sh(およびbashでも)で動作します。
もう1つはカウントダウンし、もう1つはカウントアップします。
#!/bin/bash -
n=${1:-10}
for ((i=n-1;i>=0;i--)) ; do printf ' %s ' "$i"; done; echo
for ((i=0;i<n;i++)) ; do printf ' %s ' "$i"; done; echo
i=$n; while [ "$((i-=1))" -ge "0" ] ; do printf ' %s ' "$i"; done; echo
i=-1; while [ "$((i+=1))" -lt "$n" ] ; do printf ' %s ' "$i"; done; echo
スクリプトを実行した結果は次のとおりです。
9 8 7 6 5 4 3 2 1 0
0 1 2 3 4 5 6 7 8 9
9 8 7 6 5 4 3 2 1 0
0 1 2 3 4 5 6 7 8 9
牙
最初の2つのループは、bash、ksh、およびzshで使用できるforループを使用します。
for (( start ; test ; execute )); do
したがって、の値は、
n
最初のパラメータがある場合はその値に設定され、存在しない場合は10に設定されます。 nが10に設定されているとします。forループは(カウンタ)を:または9
i
より小さい1に設定します。$n
i=n-1
テスト区間を実行して比較し
9
ました。>=
0
printfは
i
ofとして実行され、印刷されます9
。9
ループの最後の実行部分が実行され、iが減少します
i--
。ループを再テストし、結果は次の
8
ようになります。>=
0
printf が実行され、8 が印刷されます。
処刑される
i--
、i
〜になる7
。i
になるまで繰り返します0
。0
is>=
比率0
(この場合は同じ)のテストはそのまま残ります。印刷してみ
0
てください。減少時
i--
i は次-1
のようになります。今テストが失敗して
-1
います。いいえ>=
比較する0
ループが終了しました。
最後の
echo
行を実行し、次の行に移動します。
最終結果:9対0が同じ行に印刷されました。9 8 7 6 5 4 3 2 1 0
ループ2
2番目のサイクルはあなたが要求した上昇サイクルです。上記と非常に似ていますが、0から始まり9で終わります。 `0 1 2 3 4 5 6 7 8 9`を印刷してください。ループ3
n
10に設定します(スクリプトに他のパラメータを提供するように変更することができます)。i
この値に設定されますi=$n
。- 次のtest(
[...]
)がtrueのときにprintfが実行されます。 - テストで最初にする
i
ことは1
。i-=1
に展開しますi = i - 1
(i--
では利用できませんsh
)。これは算術拡張に含まれており$((...))
、引用されています(IFSの問題を避けるため)。この算術拡張により、9
次のi
ループに対してこの値が保持されます。 - 値の
9
数値比較を実行して、値-ge
が正しいことを確認します。Gリピータまたは第二同じ"0"
。 - このように
9
printf を実行して印刷します。>=
"0"
9
- ループが繰り返され、今ではとマイナス1に
i
なります。9
8
- それでも
8
8が印刷されます。>=
"0"
i
に減るまで繰り返します0
。テストはまだ真なので、値は0
still>=
(この場合は同じ)です"0"
。 A0
が印刷されます。- カウンタは
-1
テスト失敗を引き起こす値に減り、ループが終了します。
ループ4
上記とほぼ同じループですが、上向きに計算されます。答え3
次のように動作する必要があります。
#!/bin/bash -x
get_total2=$(echo "$@")
count=0
while [ $count -lt $get_total2 ]; do
echo $count
count=$(expr $count + 1)
done
プロンプトが表示されたら、計算を中止するには数字を入力する必要があります。構文エラーがある可能性がありますが、確認していません。これを行うより簡単な方法があるかもしれません。
答え4
ingを使用する((i++))
か、((++i))
直接使用する他の変形echo
角かっこを使用してください。
#!/bin/bash
total="$1" i=0
echo -n "Using i++: "
while [ $i -lt $total ]; do echo -n " $((i++)) "; done; echo
i=0
echo -n "Using ++i: "
while [ $i -lt $total ]; do echo -n " $((++i)) "; done; echo
出力:
$ ./count.sh 5
Using i++: 0 1 2 3 4
Using ++i: 1 2 3 4 5
使用c-style
:
total="$1"
while (( i < total )); do
echo -n " $((i++)) " # or " $((++i)) "
done; echo
# total: 5
# output i++: 0 1 2 3 4
# output ++i: 1 2 3 4 5
または、次のものを使用できますuntil
。
until (( i == total )); do echo -n " $((i++)) "; done; echo
# count.sh 5
# output: 0 1 2 3 4
いくつかの説明:
echo $((i++))
まず印刷してから増やし、そのecho $((++i))
逆も同様です。
したがって、x
初期値がこれ0
を行うとecho $((i++))
印刷0
さx
れます1
。証明する:
$ echo $((x++))
0
$ echo $x
1
$ echo $((++x))
2
$ echo $x
2