$@ 在数学循环中使用

Dan*_*395 1 bash shell-script environment-variables regular-expression math

我正在尝试编写一个 Bash 脚本,它将数字列表作为命令行参数,然后输出这些数字的总和。

因此,脚本将按原样运行,script.sh 1 555 22 122 66然后将它们汇总起来。我知道它们需要传递给$@变量,然后可能会运行一个循环,但我不明白如何将 的内容转换为$@int 来进行数学运算。我试图这样做:

#!/bin/bash
for i in $@
do
    $@+$@
    echo "the total is `$@`"
done
Run Code Online (Sandbox Code Playgroud)

jes*_*e_b 8

您可以通过以下方式完成此操作:

tr ' ' '+' <<<"$@" | bc
Run Code Online (Sandbox Code Playgroud)

它接受所有传递的参数并用+符号替换空格,然后将其通过管道传送到bc.

  • 我敢肯定有各种各样的原因不是我没有想到的,但是一个 * 可以 * 在 shell `IFS=+; 中本地做同样的事情;回声 $(($*))` (7认同)

ImH*_*ere 8

通常,如果在算术$((...))扩展中使用,参数会自动转换为整数。此循环将对所有参数求和:

for x; do sum=$((sum+x)); done; echo "$sum"
Run Code Online (Sandbox Code Playgroud)

当 ac 程序处理 argv[] 数组时,shell 将所有参数缓存在单独的内存位置。Shell 用户不需要直接处理该数组,Shell 通过将它们分配给 $1、$2、$3 等来提供帮助。Shell 还将此类列表抽象为“$@”。最后,语法for xfor x in "$@"循环所有参数的简写。

假设参数是不以零开头的十进制数、以零开头的八进制数或以 开头的十六进制数0x,并且总和不会溢出(64 位系统中为 2^63-1)

这份清单:

$ ./script 12 021 0xab
Run Code Online (Sandbox Code Playgroud)

将打印200(十进制结果)。

  • 如果你想强制将数字作为基数为 10 的数字,那么 `do sum=$(( sum + 10#$x )); done;`(至少在 Bash 中有效) (3认同)