#!/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つの値が残りました。