2015-05-14 40 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