【问题标题】:Calculate maximum argument passed to a bash script计算传递给 bash 脚本的最大参数
【发布时间】:2011-12-24 19:39:26
【问题描述】:

我正在尝试计算传递给 bash 脚本的最大参数。代码如下:

#!/bin/sh

max=$1

for var in "$@"
do
    if ($var>$max)
    then
        max=$var
    fi
done

echo $max

这是我得到的:

$ /bin/sh my_script 1 2 3
rgz: 11: 1: not found
rgz: 11: 2: not found
rgz: 11: 3: not found
1

我做错了什么?

【问题讨论】:

  • 您现在在当前目录中有一个名为“1”的文件应该是一个线索......
  • 我的当前目录中确实有一个名为“1”的文件,但我不明白为什么......
  • $var>$max 被解释为“在$var 中运行命令,将输出放在$max 命名的文件中”。

标签: bash unix terminal


【解决方案1】:

这可能对你有用 -

#!/bin/bash

max="$1"
for var in "$@"
do
    if [ "$var" -gt "$max" ] # Using the test condition
    then
        max="$var"
    fi
done
echo "$max"

【讨论】:

  • 好一个,只是几个cmets:原来使用#!/bin/sh作为shebang,你的正确使用#!/bin/bash重要的是要知道sh是不同的(即使别名为bash);我宁愿使用(( 而不是[,但即使你使用它,最好选择[[ 而不是[
  • 感谢 @Samus_ 的 cmets。我在这里可能错了,但是当您执行复合条件时(即检查两个或多个条件时)没有使用 [[ 吗?
【解决方案2】:

这是我的。小改进...

#!/bin/bash

max="$1"
for v in "$@"
do
  [[ $v -gt $max ]] && max=$v
done
echo "$max"

【讨论】:

  • 这并没有提供问题的答案。要批评或要求作者澄清,请在其帖子下方发表评论。
  • @WouterJ 我只是为已接受的答案提供了一个较短的版本。
  • 应该在评论中。
  • 如果你能找到一种在评论中格式化的好方法,我完全赞成。
【解决方案3】:

您可以将结果通过管道传输到sort,并使用tail 找到最大值(排序列表中的最后一项):

your stuff | sort -n | tail -1

这可能不是获得最大值的计算上最有效的方法,但可以完成工作。

【讨论】:

    猜你喜欢
    • 2021-11-18
    • 2012-12-29
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多