2016-11-16 35 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]は、あなたのパラメータ拡張で中括弧を使用しないことによって引き起こされます。どんな形でも、$vectorを参照すると、vectorが配列の場合、最初の要素が展開されます。ここ

最大の問題は、[[ $foo > $bar ]]がこれらの値に文字列としてではなく、数値としてを比較することである(それは9はなく1で始まるため)ので、92166よりも大きいです。 (())を使用して数学コンテキストを入力します。<>は数値の比較を行い、$の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" 
関連する問題