#!/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
注意:这并不是解决您问题的方法,只是指出如何整理您已有的代码以及为什么它无法正常工作。
首先,你需要一致地缩进你的代码,否则它会看起来很混乱,而且你很容易迷失方向。
其次,为了让代码运行时没有语法错误,您需要修复一些问题:
- 条件句中缺少
$
thenum
while
- 缺少
do
和done
forfor
循环。
修复这些错误,缩进并删除一些过多的空白行,您的代码将变为:
#!/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/