2015-05-14 43 views
1

我有50个变量始终更改值。它们的值是整数,例如1-9999,但我不知道这些值是什么,直到脚本运行。Bash脚本:从数组中选择具有最高值和输出变量名称的变量,而不是值

我需要显示具有最高值的变量的名称。实际价值对我来说并不重要。

这些变量被称为Q1 - Q50。

例子:

Q34=22 
Q1=23 
Q45=3 
Q15=99 

输出必须只说Q15

能否请你帮我在正确的方向?

+1

有你使用不同的变量与数字后缀的任何理由,而不是一个真正的阵列?如果你使用了一个带有元素'$ {Q [0]}','$ {Q [1]}'的真实数组,那么这会容易得多。 –

+0

@Tom:使用单独的变量可启用无循环的解决方案,调用'set'。 –

+0

我想我可以使用元素汤姆。正如我所说我是一个noob,所以我没有看到光线;) – awenis

回答

0

这对我的作品,例如Q1-Q5

Q1=22 
Q2=23 
Q3=3 
Q4=99 
Q5=16 

for i in $(seq 1 5); do 
    name=Q$i 
    value=${!name} 
    echo "$name $value" 
done | sort -k2n | tail -1 | awk '{print $1}' 

Q4

+0

没有必要在'bash'中使用'eval'。 – chepner

+0

我该如何改进? –

+0

看到我或Josh Jolly的回答。您正在使用'eval'来执行间接参数扩展。 – chepner

3

您可以使用variable indirection此:

for var in Q{1..50}; do 
    [[ ${!var} -gt $max ]] && max=$var 
done 
echo \$$max 
+0

谢谢乔希。像魅力和最少量的代码一样工作。工作很好,再次感谢。 – awenis

0

使用间接变量扩展运行50个变量中的每个变量,然后保存其值最大的名称。

for ((i=1; i<= 50; i++)); do 
    name=Q$i 
    value=${!name} 
    if ((value > biggest_value)); then 
     biggest_value=$value 
     biggest_name=name 
    fi 
done 

printf "%s has the largest value\n" "$biggest_name" 
+0

谢谢Chepner,我感谢所有的帮助。 – awenis

1

向所有瓦尔和grep你:

set | egrep "^Q[0-9]=|^Q[1-4][0-9]=|^Q50=" | sort -nt= -k2 | tail -1 | cut -d= -f1