2016-11-16 176 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" 
相关问题