我如何创建一个 bash 脚本,用户可以使用它来计算任意数量的命令行参数的总和?例如,假设我的脚本名为 sum:
sum 3
3
sum 3 5
8
sum 9 8 21
38
等等..我意识到我必须循环遍历命令行参数并将它们增加到总数,但我不太确定该怎么做。我不确定如何将第二个命令行参数引用到特定变量或如何获取命令行参数总数。
答案1
不需要bash
, plainsh
也可以:
#! /bin/sh -
IFS=+; echo "$(($*))"
$*
在 POSIX shell 中,扩展为位置参数列表(在本例中为脚本的参数),由第一个字符$IFS
(如果$IFS
未设置则为空格,如果$IFS
为空则为空)分隔。$((...))
是shell内部算术扩展运算符(注意它支持十进制、八进制和十六进制数)
如果您需要浮点支持,那么您需要不同的 shell,例如ksh93
or zsh
(bash
不仅bash
支持整数算术),尽管您也可以使用awk
:
#! /usr/bin/awk -f
BEGIN {t=0; for (i in ARGV) t+=ARGV[i]; print t}
这将使用系统实现的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
答案2
您可以使用以下 bash 函数:
sum() {
local sum=0
for arg in "$@"; do
(( sum += arg ))
done
echo $sum
}
答案3
非循环变体:
{ printf %d+ "$@"; echo 0; } | bc
例子
将以上内容放入脚本文件中,sum
.
#!/bin/bash
{ printf %d+ "$@"; echo 0; } | bc
像这样运行它:
$ ./sum 4
4
$ ./sum 4 4 5
13