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

从bash数组中查找最大值和最小值,bash,shell,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 m

我有一个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
输出是

177[0]92 16 25

为什么第一个字母显示为int[0]?正因为如此,我无法比较它们。我什么都想不出来……

您的尾随[0]是由于未能在参数展开中使用花括号造成的。无论如何,除了清楚之外,没有必要使用它们——如果vector是数组,那么引用$vector将扩展第一个元素

这里最大的问题是[[$foo>$bar]]将这些值作为字符串而不是数字进行比较,因此92大于166,因为它以9而不是1开头。用于输入数学上下文,在该上下文中,执行数值比较和$sigil是不必要的变量名

#!/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"
尾随[0]是由于未能在参数展开中使用花括号造成的。无论如何,除了清楚之外,没有必要使用它们——如果vector是数组,那么引用$vector将扩展第一个元素

这里最大的问题是[[$foo>$bar]]将这些值作为字符串而不是数字进行比较,因此92大于166,因为它以9而不是1开头。用于输入数学上下文,在该上下文中,执行数值比较和$sigil是不必要的变量名

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

max=${vector[0]};min=${vector[0]}如果您在提问之前检查了文件中的数组读取是否是您的问题,那么您本可以提出一个更为集中的问题。顺便说一句,declare-p vector是一种最好的方法,可以按该名称打印变量的完全已知/可知的值。我讨厌使用bash。python-c导入系统;sys.stdin.readline.split';'中i的printmaxinti@奥列甘德里亚诺夫,嗯?bash在这方面还不错,尽管OP使用它的方式非常糟糕,例如,它们执行的是ASCII字符串比较,而不是数字比较。尽管如此,启动Python解释器的开销超过了任何合理列表长度的shell执行时间;min=${vector[0]}如果您在提问之前检查了文件中的数组读取是否是您的问题,那么您本可以提出一个更为集中的问题。顺便说一句,declare-p vector是一种最好的方法,可以按该名称打印变量的完全已知/可知的值。我讨厌使用bash。python-c导入系统;sys.stdin.readline.split';'中i的printmaxinti@奥列甘德里亚诺夫,嗯?bash在这方面还不错,尽管OP使用它的方式非常糟糕,例如,它们执行的是ASCII字符串比较,而不是数字比较。尽管如此,启动Python解释器的开销超过了任何合理列表长度的shell执行时间。