如何创建一个总结任意数量命令行参数的 bash 脚本?

Joh*_*ohn 5 bash shell-script arithmetic

我将如何创建一个用户可以用来对任意数量的命令行参数求和的 bash 脚本?例如,假设我的脚本名为 sum:

sum 3
Run Code Online (Sandbox Code Playgroud)

3

sum 3 5
Run Code Online (Sandbox Code Playgroud)

8

sum 9 8 21
Run Code Online (Sandbox Code Playgroud)

38

依此类推..我意识到我将不得不遍历命令行参数并将它们增加到总数,但我不确定如何做到这一点。我不确定如何将第二个命令行参数引用到特定变量或如何获取总命令行参数的数量。

Sté*_*las 15

不需要bash,plainsh也可以:

#! /bin/sh - 
IFS=+; echo "$(($*))"
Run Code Online (Sandbox Code Playgroud)

$*在 POSIX shell 中,扩展到位置参数列表(在这种情况下,脚本的参数)由第一个字符分隔$IFS(如果$IFS未设置,则为空格,如果$IFS为空则为空)。$((...))是shell内部算术扩展运算符(注意它支持十进制、八进制和十六进制数)

如果您需要浮点支持,这就是你需要一个不同的壳状ksh93zsh(不bash作为bash只支持整数运算),虽然你也可以使用awk

#! /usr/bin/awk -f
BEGIN {t=0; for (i in ARGV) t+=ARGV[i]; print t}
Run Code Online (Sandbox Code Playgroud)

这将使用您的系统实现的long(对于整数)和double(对于浮点)类型的数字。输入的数字必须是十进制浮点数或英文样式的工程符号(浮点分隔符是点字符,与语言环境无关)。在某些awk实现中,如果第一个数字是负数,awk它将尝试将其解释为选项时失败。

当 POSIXLY_CORRECT 在环境中时,一些awk实现(如 GNU)awk也支持十六进制,包括二进制指数符号。或者使用--non-decimal-data,它理解八进制和十六进制:

$ POSIXLY_CORRECT=1 ./sum  0xap3 0xa
90 # (0xa * 2^3) + 0xa
$ awk --non-decimal-data -f ./sum  010
8
Run Code Online (Sandbox Code Playgroud)


Rad*_*anu 8

您可以使用以下 bash 函数:

sum() {
    local sum=0
    for arg in "$@"; do
        (( sum += arg ))
    done   
    echo $sum
}
Run Code Online (Sandbox Code Playgroud)

  • `$#` 是参数的数量 (4认同)
  • @John `$1` 是第一个参数,`$2` 是第二个参数,依此类推。变量 $0 是脚本的名称。参数的总数存储在 $# 中。变量 $@ 和 $* 返回所有参数。另见:http://how-to.wikia.com/wiki/How_to_read_command_line_arguments_in_a_bash_script (2认同)

ric*_*ici 8

非循环变体:

{ printf %d+ "$@"; echo 0; } | bc
Run Code Online (Sandbox Code Playgroud)

例子

将上述内容放在脚本文件中,sum.

#!/bin/bash

{ printf %d+ "$@"; echo 0; } | bc
Run Code Online (Sandbox Code Playgroud)

像这样运行它:

$ ./sum 4
4
$ ./sum 4 4 5
13
Run Code Online (Sandbox Code Playgroud)