Bash - 一般的なカウンターを作成する方法は? [閉鎖]

Bash - 一般的なカウンターを作成する方法は? [閉鎖]

だから私は私が呼ぶもの(公式名であるかどうかはわかりません)を「カウンター」にし、基本的に特定の範囲や数字に関連する作業をするのに慣れています。

#!/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
  • ++ii = i + 1)#iは1になります
  • 1 < 3->正しい
  • echo 1
  • ++ii = i + 1)#iは2になる
  • '2<3`->真
  • echo 2
  • ++ii = 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ループは(カウンタ)を:または9iより小さい1に設定します。$ni=n-1

  • テスト区間を実行して比較し9ました。>=0

  • printfはiofとして実行され、印刷されます99

  • ループの最後の実行部分が実行され、iが減少しますi--

  • ループを再テストし、結果は次の8ようになります。>=0

  • printf が実行され、8 が印刷されます。

  • 処刑されるi--i〜になる7

  • iになるまで繰り返します0

  • 0is>=比率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

  • n10に設定します(スクリプトに他のパラメータを提供するように変更することができます)。
  • iこの値に設定されますi=$n
  • 次のtest([...])がtrueのときにprintfが実行されます。
  • テストで最初にするiことは1i-=1に展開しますi = i - 1i--では利用できませんsh)。これは算術拡張に含まれており$((...))、引用されています(IFSの問題を避けるため)。この算術拡張により、9次のiループに対してこの値が保持されます。
  • 値の9数値比較を実行して、値-geが正しいことを確認します。Gリピータまたは第二同じ"0"
  • このように9printf を実行して印刷します。>="0"9
  • ループが繰り返され、今ではとマイナス1にiなります。98
  • それでも88が印刷されます。>="0"
  • iに減るまで繰り返します0。テストはまだ真なので、値は0still >=(この場合は同じ)です"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++))印刷0xれます1。証明する:

$ echo $((x++))
0
$ echo $x
1
$ echo $((++x))
2
$ echo $x
2

関連情報