2016-11-16 541 views
0

我有一個txt文件,其中寫有一個「;」的整數值,分隔器。 117; 92; 16; 20;從bash數組中查找最大值和最小值

我需要比較這些並選擇最高的一個。 我的代碼:

IFS=';' #Internat Field Separator 
read -ra vector<$file 
max=$vector[0] 
min=$vector[0] 

for i in ${vector[@]} 
do 

if [[ $i > $max ]] ; then 
max=$i 
fi 

if [[ $i < $min ]] ; then 
min=$i 

fi 
done 
echo "Max value is $max, minimal value is $min" 
break 

輸出是:

最大值爲92,最小值爲16

所以當然這是錯誤的。當我嘗試呼應它:

echo $value (in a loop of course) 

輸出是

177 [0] 92 16 25

爲什麼第一個字母顯示爲INT [0]?正因爲如此,我無法比較它們。我找不出任何東西....

+1

'max = $ {vector [0]}; min = $ {vector [0]}' – anubhava

+0

如果您在查詢之前是否檢查過它是否是一個實際上是您的問題的讀取數組,那麼您可能會問一個更具針對性的問題。 –

+0

順便說一下,'declare -p vector'是一種最佳實踐方式,可以通過該名稱爲變量輸出一個完全已知/可知的值。 –

回答

2

您的結尾[0] s是由於未能在參數展開中使用大括號而引起的。如果vector是一個數組,那麼對於$vector擴展第一個元素是沒有必要的。

最大這裏的問題是,這些[[ $foo > $bar ]]比喻爲字符串,而非數字,因此92是大於166(因爲它與9,而不是1開始)。使用(())輸入一個數學上下文,其中<>執行數字比較,並且$ sigils對變量名稱不需要。

#!/usr/bin/env bash 

IFS=';' read -ra vector <"$file" 
max=${vector[0]} 
min=${vector[0]} 

for i in "${vector[@]}"; do 
    ((i > max)) && max=$i 
    ((i < min)) && min=$i 
done 

echo "Max value is $max, minimal value is $min"