从bash数组中查找最大值和最小值

时间:2016-11-16 21:20:28

标签: bash shell

我有一个txt文件,其中写有整数值,带有“;”分隔器。 117; 92; 16; 20;

我需要比较这些并选择最高的一个。 我的代码:

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 个答案:

答案 0 :(得分:4)

您的跟踪[0]是由于在参数扩展中未使用大括号造成的。无论如何,它们都不需要超出清晰度 - 如果$vector是一个数组,则引用vector扩展第一个元素。

这里最大的问题是[[ $foo > $bar ]]将这些值比较为字符串,而不是数字,因此92大于166(因为它始于9而不是1)。使用(( ))输入数学上下文,其中<>执行数字比较,$符号不必围绕变量名称。

#!/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"