配列を整列せずに要素。 Bashスクリプトから

配列を整列せずに要素。 Bashスクリプトから
#!/bin/bash -x

i=1

while [ "$i" -le 10 ]; do
 number[$i]=$((RANDOM%1000+100))
    ((i += 1))
done

echo "${number[@]}"
largest=${number[0]}
smallest=${number[0]}
for j in "${number[@]}"
    do
        if [[ "$j" -lt "$smallest" ]]; then
        smallest="$j"
        fi
        if [[ "$j" -gt "$largest" ]]; then
        largest="$j"
        fi
        
done
echo "largest element is: $largest"
echo "smallest element is: $smallest"   

このプログラム出力では、最初に最小の要素と最大の要素が得られましたが、2番目の要素が必要です。

答え1

実際にはスクリプトをテストしていませんが、理論的には最大と最小のものを見つける必要があります。しかし、必要な2番目に大きく、2番目に小さいものではありません。

また、乱数発生器にはいくつかの欠陥があります。 3桁の数字ではなく、1099までの数字生成が可能です。

しかし、あなたの仕事に対する私の試みは次のとおりです。

#!/usr/bin/env bash

for ((i=0;i<10;i++)); do
    numbers+=($(((RANDOM%900)+100)))
done

largest=0
oldlargest=0
smallest=1000
oldsmallest=1000

for n in "${numbers[@]}"; do
    if [[ $n -gt $largest ]]; then
        oldlargest=$largest
        largest=$n
    elif [[ $n -gt $oldlargest && $n -lt $largest ]]; then
        oldlargest=$n
    fi
    if [[ $n -lt $smallest ]]; then
        oldsmallest=$smallest
        smallest=$n
    elif [[ $n -lt $oldsmallest && $n -gt $smallest ]]; then
        oldsmallest=$n
    fi
done


printf 'Second largest is: %d\nSecond smallest is: %d\n' "$oldlargest" "$oldsmallest"

誰かがこれを行うよりエレガントな方法を見つけることができると確信していますが、これはこれまでの最大数と最小数、そしてこれまでの2番目に大きい数と最小数を追跡します。最後に、2つの値が残りました。

関連情報