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内部算术扩展运算符(注意它支持十进制、八进制和十六进制数)
如果您需要浮点支持,这就是你需要一个不同的壳状ksh93
或zsh
(不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)
您可以使用以下 bash 函数:
sum() {
local sum=0
for arg in "$@"; do
(( sum += arg ))
done
echo $sum
}
Run Code Online (Sandbox Code Playgroud)
非循环变体:
{ 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)