我需要递归地找到shell中的数字总和。但我有一个错误: 第10行:5 +:语法错误:应为操作数(错误标记为“ +”)
function countofnumbers
{
if [ $1 -lt 10 ]
then
return $1
else
let z=$1/10
let result=expr`$(($(( $1 % 10 )) + $(countofnumbers $z)))`
fi
return $result
}
z=15
echo $(countofnumbers $z)
答案 0 :(得分:1)
您非常接近,干得好!
function countofnumbers {
if [ $1 -lt 10 ]
then
echo $1
else
z=$(( $1 / 10 ))
result=$(( $(( $1 % 10 )) + $(countofnumbers $z) ))
fi
echo $result
}
这是我所做的更改:
z=$(( $1 / 10 ))
每次使用bash进行数学运算时,请将其包装在算术运算符$(( ))
中。尽管let
也可以正常工作,但是您似乎或多或少地随机组合了所有3种样式(expr
,let
,$(( ))
)。如果坚持一种样式,您的代码将更具可读性。
result=$(( $(( $1 % 10 )) + $(count $z) ))
您对此有太多的了解。仅算术运算符就足够了。 expr
是算术运算符的另一种形式,但是我们在这里不需要它。
return $1
return $result
Bash不像其他任何编程语言一样执行return
。 Return是返回码,为0-255,主要用于表示是否发生错误。捕获的结果与您想像的一样,例如
mynum=$(countofnumbers 12)
echo $mynum
> 3
答案 1 :(得分:0)
首先:bash是唯一该工作的错误工具。
但是,无论如何:
return
; return
语句设置退出状态。您应该使用echo
来产生函数的输出。expr
是命令,应放在反引号内,其后有空格,以便运行。let
,expr
和$(())
混合在一起非常麻烦,因为将它们全部嵌套在一行中也是如此。宁愿仅使用$(())
进行算术扩展(这是最标准和可移植的方法),并且更喜欢将复杂的表达式分解为较小的表达式。已修复:
function countofnumbers
{
if [ "$1" -lt 10 ]
then
echo "$1"
else
z=$(($1 / 10))
modded=$(($1 % 10))
recursive_call=$(countofnumbers $z)
result=$((modded + recursive_call))
fi
echo "$result"
}
z=15
countofnumbers "$z"