我真的不太了解数组,但我需要知道如何查找和打印数组的最大值和最小值。该数组是由读取命令预定义的,系统将提示用户输入n个整数。
如何将读取输入分配给数组,并查找和显示数组的最大值和最小值?
有没有一种方法可以测试数组元素,看看它们是否都是整数?
#!/bin/bash
read -a integers
biggest=${integers[0]}
smallest=${integers[0]}
for i in ${integers[@]}
do
if [[ $i -gt $biggest ]]
then
biggest="$i"
fi
if [[ $i -lt $smallest ]]
then
smallest="$i"
fi
done
echo "The largest number is $biggest"
echo "The smallest number is $smallest"
发布于 2012-11-30 04:49:43
一般的想法是遍历数组一次,并跟踪到目前为止max
和min
在每个步骤中看到的内容。
内联的一些注释和解释(前缀为#
)
# This is how to declare / initialize an array:
arrayName=(1 2 3 4 5 6 7)
# Use choose first element of array as initial values for min/max;
# (Defensive programming) - this is a language-agnostic 'gotcha' when
# finding min/max ;)
max=${arrayName[0]}
min=${arrayName[0]}
# Loop through all elements in the array
for i in "${arrayName[@]}"
do
# Update max if applicable
if [[ "$i" -gt "$max" ]]; then
max="$i"
fi
# Update min if applicable
if [[ "$i" -lt "$min" ]]; then
min="$i"
fi
done
# Output results:
echo "Max is: $max"
echo "Min is: $min"
发布于 2012-11-30 04:54:00
如果您需要比较(签名或未签名) INTegers:
#!/bin/bash
arr=( -10 1 2 3 4 5 )
min=0 max=0
for i in ${arr[@]}; do
(( $i > max || max == 0)) && max=$i
(( $i < min || min == 0)) && min=$i
done
echo "min=$min
max=$max"
输出
min=-10
max=5
解释
arr=( )
是array((...))
是算术命令的声明,如果表达式为非零,则返回0的退出状态,如果表达式为零,则返回1。如果需要副作用(赋值),也可用作"let“的同义词。See是一个类似于[
命令(但比它更强大)的http://mywiki.wooledge.org/ArithmeticExpression[[
关键字。除非你是在为POSIX sh编写代码,否则请参阅http://mywiki.wooledge.org/BashFAQ/031和http://mywiki.wooledge.org/BashGuide/TestsAndConditionals。我们建议在foo失败时运行bar :执行[[ -d $foo ]] || { echo 'ohNoes!' >&2; exit 1; }
cmd1 && cmd2
:cmd1,然后如果其退出状态为0 (true),则执行cmd2。请参阅http://mywiki.wooledge.org/BashGuide/TestsAndConditionals发布于 2012-11-30 05:14:54
一种有趣的排序方式:
如果您有一个整数数组,则可以使用sort
对其进行排序,然后选择第一个和最后一个元素以包含最小和最大元素,如下所示:
{ read min; max=$(tail -n1); } < <(printf "%s\n" "${array[@]}" | sort -n)
因此,如果您想提示用户输入10个整数,请检查用户是否输入了整数,然后对它们进行排序,您可以这样做:
#!/bin/bash
n=10
array=()
while ((n));do
read -p "[$n] Give me an integer: " i
[[ $i =~ ^[+-]?[[:digit:]]+$ ]] || continue
array+=($i)
((--n))
done
# Sort the array:
{ read min; max=$(tail -n1); } < <(printf "%s\n" "${array[@]}" | sort -n)
# print min and max elements:
echo "min=$min"
echo "max=$max"
https://stackoverflow.com/questions/13634429
复制相似问题