Bash确定最高和最低变量之间的差异

时间:2015-04-14 13:27:06

标签: linux bash shell variables difference

作为三个变量的一部分,我想确定最高和最低之间的差异是否小于定义的范围。

Val1
Val2    
Val3

到现在为止,我只有两个Val而且我使用了类似的东西:

let diff=${Val1}-${Val2}

然后,我计算了包含在" diff"。

中的绝对值
if [ "$diff" -ge 0 ]                    
then                                
    absval=$diff                        
else                                
    let "absval = (( 0 - $diff ))"      
fi  

但是现在,更有效的方法是什么?

4 个答案:

答案 0 :(得分:2)

使用if测试直接比较变量。

if [[ $Val1 -gt $Val2 ]]
then highest=$Val1
else highest=$Val2
fi

if [[ $Val3 -gt $highest ]]
then highest=$Val3
fi

如果您有更多变量,您可以继续这样做:

if [[ $Val4 -gt $highest ]]
then highest=$Val4
fi

使用-lt的类似步骤获得最低值。

另一种方法是对值进行排序,然后得到第一行和最后一行:

sorted=$(printf "%s\n" $Var1 $Var2 $Var3 | sort -n)
highest=$(echo "$sorted" | tail -1)
lowest=$(echo "$sorted" | head -1)
diff=$(( highest - lowest ))

答案 1 :(得分:2)

如果允许则使用awk

awk '{max=$1<max&&max~/./?max:$1;min=$1>min&&min~/./?min:$1}END{print max-min}' file

输入

  

1
  2
  10个
  5
  3
  9

输出

9

答案 2 :(得分:2)

最有效的方法(你必须意识到,对于任何特定输入可能不是最快的方式)是迭代列表并简单地跟踪到目前为止最小和最大的数字

while read num; do
    if (( num > highest )); then highest=num; fi
    if (( num < lowest )); then lowest=num; fi
done <<EOF
Val1
Val2    
Val3
...
EOF

diff=$(( highest - lowest ))

理论上,排序不是找到最高和最低的最有效方法,因为您不需要做额外的工作来按顺序放置所有数字。 (实际上,在bash中的O(n)算法优于C中sort实现的O(n lg n)算法之前,可能需要大量数字。)

答案 3 :(得分:0)

如果您可以将它们放在一个文件中,您可以在一个命令sort -V <filename>中完成。这在数字上对它们进行排序。如果你有很多要排序的值,这可能是一个更好的选择,代码少得多。

以下是一个例子:

cat <filename>
1
2
10
5
3
9

sort -n <filename>
1
2
3
5
9
10

如果您想获得最低和最高数字以及它们之间的差异,您可以这样做。

result=$(sort -n <filename>)
high=$(echo "$result" | tail -1)
low=$(echo "$result" | head -1)
diff=`expr $high - $low`

echo "Highest is $high"
echo "Lowest is $low"
echo "Diff is $diff"