$@ 在数学循环中使用

$@ 在数学循环中使用

我正在尝试编写一个 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' "$(( $* ))"

相关内容