Bash スクリプトについて学ぶ

Bash スクリプトについて学ぶ

本の次のスクリプトを理解するには、いくつかの問題があります。

values=(39 5 36 12 9 3 2 30 4 18 22 1 28 25)
numvalues=${#values[@]}

for (( i=0; i < numvalues; i++ )); do 
    lowest=$i

    for (( j=i; j < numvalues; j++ )); do
        if [ ${values[j]} -le ${values[$lowest]} ]; then
            lowest=$j
        fi
    done

    temp=${values[i]}
    values[i]=${values[lowest]}
    values[lowest]=$temp
done

for (( i=0; i < numvalues; i++ )); do
    echo -ne "${values[$i]}\t"
done

echo

スクリプトは配列内の数値に対して選択ソートを実行し、最後に正しい数値順にソートします。本によると:

外部i forループは、配列全体を繰り返し、現在の「ヘッド」(交換する必要がある値を入力する場所)を指すために使用されます。 low変数はこのインデックスに設定されます。

この部分を理解しています。最初の反復の最も低い値は、インデックス0、値39になりそうです。

内部jループの仕組みを理解するのに問題があります。その本はこう言います。

残りの要素を最も低い値と比較します。値が最も低い値より小さい場合は、その要素のインデックスを設定します。

jの値がの値とどのように異なるかはわかりませんi。私の考えでは、j=i最初の反復でゼロの場合、この値もjゼロに等しくなります。私はこれが2回目以降の反復で変更されるべきだと思います。スクリプト部分が計算する値なので、値がj値と異なる必要があることを知っています。i[ ${values[j]} -le ${values[$lowest]} ]

これは内部forループの後続部分のために機能しますかj=ij++If j=i、そして2回目の繰り返しでは、ifは2に等しいというi=1意味ですか?j++

新しいコメント:

このスクリプトについてさらに考えてください。内部ループでj = i + 1がどのように機能するかを見ることができます。最初の反復では、iが0でjが1なので、最初の要素と2番目の要素の値を比較します。追加の繰り返しでは、i = 1、j = 2、i = 2、j = 3など...

しかし、私が書いたスクリプトでは、それがどのように機能するのかよく理解していません。最初の反復では、i = 0、j = 0です。したがって、配列の最初の値は自分と比較されます。もちろん、2番目の反復ではi = 1、j = 2なので、2番目と3番目の値を比較します。インデックス0がインデックス1とどのように比較されるかわかりません。 5と比較すると39です。もちろん、2回目の反復では5を36と比較するので、これをスキップします。

ベストアンサー1

私の考えでは、最初の反復でj = iが0の場合、jも0と同じです。

正しく、内部ループのすべての最初の反復についてはjと同じですi

私はこれが2回目以降の反復で変更されるべきだと思います。

また正確です(内部ループの場合)。内側ループの最初の反復には、j外側ループの反復に保持されているすべての値が含まれます。i

スクリプト部分が計算する値なので、値がj値と異なる必要があることを知っています。i[ ${values[j]} -le ${values[$lowest]} ]

(内部ループの)2回目の繰り返しから始まります。

If j=i、そして2回目の繰り返しでは、ifは2に等しいというi=1意味ですか?j++

これは内部ループ1の2回目の繰り返しでも同様です。

これで、内部ループの最初の繰り返しごとに、ijlowest同じです。なぜ?lowestはすでに設定されていますi。繰り返し開始時に設定すると、後続のjテストはに設定されます。つまり、同じ要素を比較するからです。したがって、この内部ループの最初の繰り返しは意味がなく、問題なく開始されます。しかし、これは間違いではなく、単に不要です。ilowestjii+1

技術的には1は2ではありませんj++。なぜなら、変数の後にaが呼び出されるからです。1++ポスト増分式に変数を評価した後に値を追加する演算子です。j2になります後ろに式が評価されました。

おすすめ記事