2

现在,由于我对 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

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

4

4 回答 4

4

您选择的答案不会这样做。如果没有负数,那是行不通的。尝试使用 list as 3,45. 这将使您知道最小值为零。

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

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

我将min和都设置max为列表中的第一个数字。然后我用shift摆脱那个号码。

现在,我遍历列表中的每个数字。$@表示命令行参数。两者 $@$*代表所有的位置参数,在这种情况下都可以工作。

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

声明类似于

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

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

||您会在列表运算符中看到类似的情况。这是一个相反的情况,||只有当前面的语句为假时才会执行后面的语句。

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

  • while statement:只要statement继续返回值,这将继续循环。在 shell 中,真值为零,假值非零。
  • $#$1 to $x是代表每个参数的命令行参数的数量。
  • $@表示所有命令行参数的列表。
  • for varin list:这会将变量设置varlist. 这通常是您在解析命令行参数时想要的。
于 2013-06-27T22:20:39.867 回答
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
于 2013-06-27T21:42:30.117 回答
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 解决方案上尝试这两个测试用例)。

于 2013-06-27T22:09:09.130 回答
0

我要参加聚会。

#!/bin/bash
{ read min; read max; } <<< "$(printf "%s\n" "$@" | sort -n | sed -n '1p;$p')"
echo "Min: $min, Max: $max"
于 2013-06-27T22:31:01.130 回答