我正在尝试编写一个 Bash 脚本,它将数字列表作为命令行参数,然后输出这些数字的总和。
因此脚本将运行script.sh 1 555 22 122 66
,然后将它们全部总结起来。我知道它们需要传递给$@
变量,然后可能运行一个循环,但我不明白如何将内容转换$@
为 int 来进行数学运算。我尝试这样做:
#!/bin/bash
for i in $@
do
$@+$@
echo "the total is `$@`"
done
答案1
一般来说,如果在算术$((...))
展开式中使用参数,参数会自动转换为整数。该循环将对所有参数求和:
for x; do sum=$((sum+x)); done; echo "$sum"
当 ac 程序处理 argv[] 数组时,shell 将所有参数缓存在单独的内存位置。 shell 用户不需要直接处理该数组,shell 通过将它们分配给 $1、$2、$3 等来提供帮助。shell 还将此类列表抽象为“$@”。最后,语法是循环所有参数的for x
简写。for x in "$@"
假设参数是不以零开头的十进制数、以零开头的八进制数或以 开头的十六进制数0x
,并且总和不会溢出(64 位系统中为 2^63-1)
这份清单:
$ ./script 12 021 0xab
将打印200
(十进制结果)。
答案2
您可以通过以下方式完成此操作:
tr ' ' '+' <<<"$@" | bc
它获取传递的所有参数并用符号替换空格+
,然后将其通过管道传输到bc
.
答案3
一一列举论据:
total=0
while [ -n "$1" ]; do
total=$((total + "$1"))
shift
done
或者使用for
循环:
total=0
for argument; do
total=$((total + "$argument"))
done
答案4
#!/bin/sh
IFS='+'
printf '%s\n' "$*" | bc
测试
$ ./script.sh 1 2 3 -1 30 0.1
35.1
将"$*"
扩展为由 shell 变量的第一个字符分隔的位置参数(命令行参数)IFS
。我们设置IFS
为加号并将字符串传递给bc
进行评估。
如果只需要整数运算:
#!/bin/sh
IFS='+'
printf '%d\n' "$(( $* ))"