元素而不对数组进行排序。在 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"

我相信有人可能会找到一种更优雅的方法来做到这一点,但这将跟踪迄今为止最大和最小的数字,以及迄今为止第二大和最小的数字。最后给我们留下两个值。

相关内容