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