【问题标题】:Sum of n numbers entered by keyboard in bash scriptbash脚本中键盘输入的n个数字的总和
【发布时间】:2022-10-24 05:48:21
【问题描述】:

我必须制作一个脚本,询问我传递给键盘的数字并将它们相加并显示累计金额。当您输入负数时,程序将结束。

我制作了以下有效的脚本,但我不相信在 for 中使用 seq 将其用作累加器,我没有想到以任何其他方式这样做。

使它更...优雅的方法?

编辑:优雅不是这个词,但如果我正在做的事情在 bash 中是正确的,或者有办法做到“规范”或“不那么奇怪”......

谢谢!

#!/bin/bash
#accumulated sum of numbers


i=0
sum=0
while [[ true ]]; do

echo "Insert a number: "
read num

if (($num < 0)); then
echo "Negative number, exit..."
break
fi

for i in $(seq $num $num); do
sum=$(($i + $sum))
done
echo "The sum of the previous numbers is $sum"

done 

【问题讨论】:

  • 只是((sum += num)) 而不是for i in $(seq $num $num); do sum=$(($i + $sum)) done 东西?
  • 一次迭代的for循环背后的想法是什么?

标签: linux bash sum


【解决方案1】:

首先,您可以使用以下 bash 函数:

sum() {
    local sum=0
    for arg in "$@"; do
        (( sum += arg ))
    done   
    echo $sum
}

第二种方法是做一个非循环变体:

{ printf %d+ "$@"; echo 0; } | bc

例子

将上面的内容放在一个脚本文件中,sum.

#!/bin/bash

{ printf %d+ "$@"; echo 0; } | bc

像这样运行它:

$ ./sum 4
4
$ ./sum 4 4 5
13

对于我可以推荐的第三种方式:

不需要 bash,普通的 sh 也可以:

#! /bin/sh - 
IFS=+; echo "$(($*))"

$* 在 POSIX shell 中,扩展为由 $IFS 的第一个字符分隔的位置参数列表(在本例中为脚本的参数)(如果 $IFS 未设置,则为空格,如果 $IFS 为空,则为空)。 $((...)) 是 shell 内部算术扩展运算符(注意它支持十进制、八进制和十六进制数)

如果您需要浮点支持,那么您将需要一个不同的 shell,如 ksh93 或 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】:

    seq $num $num 显示了从 $num 到 $num 的序列号,在这里既不优雅也不正确。

    我会这样写:

    #!/bin/bash
    #accumulated sum of numbers
    
    i=0
    sum=0
    while [[ true ]]; do
    
    echo "Insert a number: "
    read num
    
    if (($num < 0)); then
    echo "Negative number, exit..."
    echo "The sum of the previous numbers is $sum"
    break
    else ((sum+=$num))
    fi
    done
    

    作为每个书呆子,我都有自己的 bash 脚本教程,请参阅 http://linuxintro.org/wiki/BaBE

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-22
      • 2019-06-22
      相关资源
      最近更新 更多