shell 从Bash数组中查找最大值和最小值

0md85ypi  于 7个月前  发布在  Shell
关注(0)|答案(1)|浏览(113)

我有一个 .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]?因此,我无法比较它们。我什么都想不出来...

hmmo2u0o

hmmo2u0o1#

尾随的[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"

相关问题