bash - 如何递归地找到数字的总和
问题描述
我需要递归地找到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)
解决方案
你很接近,干得好!
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
Bashreturn
不像任何其他编程语言。return是指返回码,是一个0-255的数字,主要用于表示是否发生错误。结果就像您想象的那样被捕获,例如,
mynum=$(countofnumbers 12)
echo $mynum
> 3
推荐阅读
- c# - C#如何从类函数中访问兄弟类?
- php - 在 Woocommerce 主页上的短代码中隐藏特价产品
- arrays - 使用 Groovy 修改 JSON 键
- sql - 使用数据库中的数量生成多条记录
- gcc - Buildroot gcc 标头与 linux-headers 不匹配
- c - 找不到“格式参数过多”的问题
- javascript - 如何以可用的方式传递条带结帐令牌
- c# - 转换 System.Datetime?到 EntityFramework 映射类中的 System.DateTime
- c# - Azure 函数未从存储队列获取消息
- entity-framework - 在 Dbcontext 中使用 Hosting env