Linux shell 编程利用迭代函数实现简单阶乘!!

2020/11/12
初学Linux shell编程,用的不习惯,今天想用迭代函数实现求简单的阶乘,搞了大几个小时,觉得有必要记下来。


1、题目

编程实现 n 的阶乘, n=10。

2、用while搞

这个比较简单:

n=10
i=$n
ans=1
while [ $i -gt 1 ] 
do
        let ans=`expr $ans \* $i`
        let i=`expr $i - 1`
done
echo $n"! ="$ans

当然也可以用until,这俩转化很容易,只有判断条件不同。

3、迭代函数

之前用其他语言写迭代函数的时候觉得很简单的,但是用shell写,写成这样:

#!/bin/bash
function fac()
{
    
    
        n=$1
        if [ $n -eq 1 ]; then
                return 1
        else
                let m=`expr $n - 1`
                s=$(fac $m)
                return $(($n*$s))
        fi
}

echo $(fac 10)

在这里插入图片描述
当然这不是最初的版本,这是我改了很多边最后报错最少的一个。到这里之后百思不得其解,最后找到一个博客,恍然大悟,博客链接如下:

https://www.cnblogs.com/duanxz/p/4661767.html

这位前辈示例是想让函数返回一个字符串,而我想让函数返回的结果与数值作数乘运算。前辈最后写道:

Shell函数返回值只能是整形数值,一般是用来表示函数执行成功与否的,0表示成功,其他值表示失败。因而用函数返回值来返回函数执行结果是不合适的。如果要硬生生地return某个计算结果,比如一个字符串,往往会得到错误提示:“numeric argument required”。
如果一定要让函数返回一个或多个值,可以定义全局变量,函数将计算结果赋给全局变量,然后脚本中其他地方通过访问全局变量,就可以获得那个函数“返回”的一个或多个执行结果了。
总结一下函数返回值获取的方法:
1)用变量接收函数返回值,函数用echo等标准输出将要返回的东西打印出来。
2)用$?来接收函数的执行状态,但是$?要紧跟在函数调用处的后面。

对,用全局变量:

#!/bin/bash
s=1  #全局变量
fac()
{
    
    
        n=$1
        if [ $n -eq 1 ] ; then
                s=$(($s*1))
        else
                let m=`expr $n - 1`
                s=$(($s*$n))
                fac $m
        fi
}
fac 10
echo $s

在这里插入图片描述
值得一提的是,变量默认为全局变量 —— 函数体内没有明确指明该变量是局部变量(local var)时,其为全局变量。


总结一下函数返回值获取的方法:
1)用变量接收函数返回值,函数用echo等标准输出将要返回的东西打印出来。
2)用$?来接收函数的执行状态,但是$?要紧跟在函数调用处的后面。

猜你喜欢

转载自blog.csdn.net/Gou_Hailong/article/details/109662252