Shellscript:比较参数,输出最大值和最小值

时间:2013-06-27 21:04:42

标签: bash shell

现在因为我对shell脚本和Linux本身相当新,所以我很困惑为什么这不起作用。一个解释和答案将是很大的帮助,因为我真的想学习这个。无论如何,这是我的代码:

      #!/bin/bash
      #
      #Script number 7
      #
      while i in $#;
      do
         if [ $i -gt $@ ]; then max=$i; fi
         if [ $i -lt $@ ]; then min=$i; fi
      done
      echo Max is: $max
      echo Min is: $min

我需要做的是获取参数列表然后比较它们并输出具有最高值和最小值的参数。我觉得我在这里完全错过了一些东西。基于我的循环,我查找大于列表的值并将其指定为max。然后我寻找最少并将其指定为分钟。任何帮助都很棒。提前谢谢!

4 个答案:

答案 0 :(得分:4)

你选择的答案是不会这样做的。如果没有负数,那将无效。尝试使用列表345。这将使您的最小值为零。

您需要做的是将最小值和最大值都设置为列表中的第一个数字,然后通过其余数字来获取它:

#! /bin/bash

min=$1
max=$1
shift

for num in $@
do
    [ $num -gt $max ] && max=$num
    [ $num -lt $min ] && min=$num
done

echo "Min = $min  Max = $max"

我将minmax都设置为列表中的第一个数字。然后我使用shift来摆脱这个数字。

现在,我查看列表中的每个号码。 $@表示命令行参数。 $@$*都代表所有位置参数,在这种情况下都可以使用。

[ $num -gt $max ] && max=$num

语句类似于

if [ $num -gt $@ ]; then max=$num; fi

类似于将if语句放在一行上的方式。但是,我这样做的方式是在BASH中完成的标准方式。 &&是列表运算符。如果&&之前的语句为真,则将执行&&之后的语句。否则,&&之后的语句将不会被执行。

您会在||列表运算符中看到类似的内容。这是一个反向,只有当前面的语句为false时才执行||之后的语句。

看起来特殊变量让你感到困惑:

  • while statement :只要 statement 继续返回 true <,就会继续循环播放/ em>价值。在shell中,true值为零,false值为非零。
  • $#是命令行参数的数量,$1 to $x表示每个参数。
  • $@表示所有命令行参数的列表。
  • for 中的
  • var list :这会设置变量 var 对于 list 中的每个项目。这通常是解析命令行参数时所需的。

答案 1 :(得分:2)

您的语法略有不同,请参阅以下示例:

#!/bin/bash


List=(-3 1 2 3 4 5);
max=-999999999;
min=999999999;

  for i in ${List[@]}
  do
     if [[ $i -gt $max ]] 
     then 
         max=$i
     fi
     if [ $i -lt $min ] 
     then
        min=$i
     fi
  done

echo Max is: $max
echo Min is: $min

您的输出应为:

Max is: 5
Min is: -3

答案 2 :(得分:0)

这是awk的工作,而不是shell:

$ cat tst.sh
awk -v argsS="$*" 'BEGIN {

    numArgs = split(argsS,argsA)
    min = max = argsA[1]

    for (idx=2; idx<=numArgs; idx++) {
        arg = argsA[idx]
        min = (arg < min ? arg : min)
        max = (arg > max ? arg : max)
    }

    print "min=",min
    print "max=",max

}'

$ ./tst.sh 3 8 2 9 4
min= 2
max= 9

$ ./tst.sh the quick brown fox jumped        
min= brown
max= the

$ ./tst.sh 3                         
min= 3
max= 3

$ ./tst.sh -2 -5 -1
min= -5
max= -1

请注意,它适用于字符串和数字,如果提供无效输入,可以轻松自定义打印“NaN”或任何您喜欢的内容,并且当所有输入无效时,它不会错误地打印“0”作为最大值当您只提供1个正数时,输入数字为负数或零为最小值(在您选择作为正确答案的shell解决方案中尝试这两个测试用例)。

答案 3 :(得分:0)

我要参加聚会。

#!/bin/bash
{ read min; read max; } <<< "$(printf "%s\n" "$@" | sort -n | sed -n '1p;$p')"
echo "Min: $min, Max: $max"