배열을 정렬하지 않고 요소. 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"   

이 프로그램 출력에서는 첫 번째로 가장 작은 요소와 가장 큰 요소를 얻었지만 두 번째 요소를 원합니다.

답변1

실제로 스크립트를 테스트하지는 않았지만 이론적으로는 가장 큰 것과 가장 작은 것을 찾아야 합니다. 그러나 필요한 두 번째로 크고 두 번째로 작은 것은 아닙니다.

또한 난수 생성기에 약간의 결함이 있습니다. 세 자리 숫자가 아닌 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"

누군가가 이 작업을 수행하는 더 우아한 방법을 찾을 수 있을 것이라고 확신하지만 이는 지금까지의 가장 큰 숫자와 가장 작은 숫자, 그리고 지금까지 두 번째로 큰 숫자와 가장 작은 숫자를 추적합니다. 마지막으로 두 가지 값이 남았습니다.

관련 정보