程序如何获取多个数字作为参数并计算它们?示例:19 10,13 4, 12 3

程序如何获取多个数字作为参数并计算它们?示例:19 10,13 4, 12 3
#!/bin/bash
# Show help function
# Call with: -h 
function help(){ cat << EOF
Arguments:
Calculate the sum of several numbers. Example: $sum 19 115 21 
                                                    10  7   3
As soon as a letter is given in the argument, the program issues an error message. 
EOF
}

#Main program
if [ "$1" == "-h" ] ; then
        help
        exit
    fi
check='^[0-9]+$'
    if ! [[ $var =~ $check ]] ; then
        echo "error: Caution! It is not a number!"
            continue
    fi

x=${1//[^0-9]/}
sum=0

for ((i=0; i<${#x}; i++));

while [[ num -gt 0 ]];do
var=$(($num % 10))
num=$(($num / 10))
sum=$(($sum + $var))
done

echo $sum

该程序必须接收一个或多个数字作为参数,并计算每个指定数字的数字总和。我什么也没得到。程序如何接收和计算多个数字作为参数? if循环和while我都用过。说明不得超过 80 个字符。

答案1

这是一种迭代的方法数字一个数并对它们求和:

sum_digits() {
    local num=$1 len=${#1} sum=0 digit i
    for ((i=0; i<len; i++)); do
        digit=${num:i:1}
        sum=$((sum + digit))
    done
    echo "$sum"
}

然后

$ sum_digits 123
6
$ sum_digits 987654321
45

${var:offset:length}是 shell 的参数扩展以提取子串超出变量的值。

答案2

我认为你把事情搞得比应有的复杂得多。看看这对你是否有用

#!/bin/bash

die()
{
  echo >&2 "$@"
  exit 1
}

usage()
{
  echo >&2 "Usage: ....."
  die
}

calc() 
{ 
  if (( $# < 1 )); then usage; fi
  local args="$@"; 
  re='^[0-9]+$'
  total=0
  for n in ${args[@]}; do
   [[ $n =~ $re ]] || die "A non digit was provided"
   ((total += n))
  done
  echo "$total"
}
calc "$@"

您将执行该脚本

./script 22 20

这就是你的答案。

答案3

注意:这并不是解决您问题的方法,只是指出如何整理您已有的代码以及为什么它无法正常工作。


首先,你需要一致地缩进你的代码,否则它会看起来很混乱,而且你很容易迷失方向。

其次,为了让代码运行时没有语法错误,您需要修复一些问题:

  • 条件句中缺少$thenumwhile
  • 缺少dodoneforfor循环。

修复这些错误,缩进并删除一些过多的空白行,您的代码将变为:

#!/bin/bash
# Show help function
# Call with: -h
function help(){
cat << EOF
Arguments:
Calculate the sum of several numbers. Example: $sum 19 115 21
                                                    10  7   3
As soon as a letter is given in the argument, the program issues an error message.
EOF
}

# Main program

if [ "$1" == "-h" ] ; then
  help
  exit
fi

check='^[0-9]+$'
if ! [[ $var =~ $check ]] ; then
   echo "error: Caution! It is not a number!"
   continue
fi

x=${1//[^0-9]/}
sum=0
for ((i=0; i<${#x}; i++)) ; do
  while [[ $num -gt 0 ]] ; do
    var=$(($num % 10))
    num=$(($num / 10))
    sum=$(($sum + $var))
  done
done
echo $sum

现在它应该运行,但它仍然不会执行您想要的操作。

首先,您不要在代码中的任何位置进行赋值num(也不要赋值)。var您可能打算将它们依次分配给每个参数:

  • 如果不分配var,您将始终收到“这不是数字”错误
  • 如果不分配num,您的总和将始终为零

答案4

使用 Raku(以前称为 Perl_6)

raku -e '.put for @*ARGS.map( *.comb).map( *.sum);' 19 115 21 22 20

输出:

10
7
3
4
2

上面是用 Raku(Perl 语言家族的成员)编写的解决方案。简而言之,命令行值被接受到@*ARGS数组中,每个值被分割成单独的字符(comb-ed),单个字符被sum合并。

请注意,如果您对数字感兴趣,Raku 提供了一些非常聪明的Rat数字功能,例如nude下面的 (“NUmerator DEnominator”) 函数。

raku -e ' say( .nude, " == ", .Num ) for @*ARGS.map( *.Rat);' 1 2/2 1/2 3/3 2/3 1/3 4/4 3/4 2/4 1/4

输出:

(1 1) == 1
(1 1) == 1
(1 2) == 0.5
(1 1) == 1
(2 3) == 0.6666666666666666
(1 3) == 0.3333333333333333
(1 1) == 1
(3 4) == 0.75
(1 2) == 0.5
(1 4) == 0.25

https://docs.raku.org/language/variables#index-entry-@*ARGS
https://docs.raku.org/type/Rational
https://raku.org/

相关内容