首页 > 系统相关 >Shell函数:递归函数、阶乘和函数库

Shell函数:递归函数、阶乘和函数库

时间:2024-09-01 21:52:22浏览次数:7  
标签:Shell 函数库 递归 echo result 阶乘 输入


文章目录


递归函数

递归是指函数在其内部调用自身。递归函数常用于解决像阶乘、斐波那契数列等问题。

示例1:阶乘计算

阶乘(Factorial)是数学中的一种运算,表示从1乘以2乘以3…直到某个数n的乘积,记作n!

例如:

  • 4! = 1×2×3×4 = 24 (24是4的阶乘)
  • 6! = 1×2×3×4×5×6 = 720 (720是6的阶乘)
#!/bin/bash
# 定义计算阶乘的函数
fact () {
   if [ $1 -eq 1 ]  # 如果输入参数等于1,直接返回1
   then
       echo 1
   else
       local temp=$[$1 - 1]    
       # 计算当前参数减1
       local result=$(fact $temp)  
       # 递归调用函数fact
       echo "$[$1 * $result]"  
       # 计算并返回当前参数乘以递归结果
   fi
}

read -p "请输入阶乘数:" n
result=$(fact $n)  # 调用函数并存储结果
echo "$result"

流程说明

  • 假如输入 5 。
  • 调用 fact 函数,并将5作为输入参数传递进去。
  • fact 函数内部,判断输入参数是否等于1。由于输入参数为5,所以不等于1。
  • 将输入参数减1,得到4。然后递归调用 fact 函数,并将4作为输入参数传递进去。
  • 依此类推,直到输入参数为1,递归终止,返回结果

示例2:递归列出目录

递归不仅可以用来计算,还可以用于遍历文件目录树。

ls -R * 比较相似。

#!/bin/bash
function list_files {
    for f in $(ls $1) # 或 `ls $1`
    do
      if [ -d "$1/$f" ]   # 如果是目录
      then
          echo "$f"  # 输出目录名
          list_files "$1/$f"  # 递归调用函数
      else
          echo "$f"  # 输出文件名
      fi
     done
}
list_files $1  # 从命令行参数获取起始目录

示例说明:

  • [ -d "$1/$f" ] ,斜杠( / )用于将参数 $1 和变量 $f 连接起来,以构造一个路径,用于检查是否存在指定的目录。例如,如果参数 1 包含 / h o m e / u s e r ,变量 1包含/home/user,变量 1包含/home/user,变量f包含mydir,则路径/home/user/mydir将被构造出来,并用于检查是否存在一个名为mydir的目录。
  • 若为目录,递归调用 list_files 继续列出子目录内容。

函数库

函数库用于将函数定义和可执行脚本代码分离,以便于复用。只包含函数定义的脚本文件称为函数库。

函数库文件 test8.sh:

#!/bin/bash
# 定义加法函数
jiafa () {
  result=$[$1 + $2]
  echo $result
}

# 定义减法函数
jianfa () {
   result=$[$1 - $2]
   echo $result
}

# 定义乘法函数
chengfa () {
   result=$[$1 * $2]
   echo $result
}

# 定义除法函数
chufa () {
    if [ $2 -ne 0 ]
    then
        result=$[$1 / $2]
        echo $result
    else
      echo "除数不能为0!"
    fi
}

主脚本文件 test9.sh:

#!/bin/bash
. /opt/jiaoben1/test8.sh  # 引入函数库
read -p "输入第一个参数值:" first
read -p "输入第二个参数值:" second

# 调用函数并存储结果
result1=$(jiafa $first $second)
result2=$(jianfa $first $second)
result3=$(chengfa $first $second)
result4=$(chufa $first $second)

# 输出结果
echo $result1
echo $result2
echo $result3
echo $result4

执行脚本:

[root@localhost aaa]# chmod +x test9.sh
[root@localhost aaa]# ./test9.sh
输入第一个参数值:20
输入第二个参数值:10
30
10
200
2

标签:Shell,函数库,递归,echo,result,阶乘,输入
From: https://blog.csdn.net/qq_44421043/article/details/141790605

相关文章

  • shell基础(保姆式教学)
    1.helloworld#!/bin/bashecho"helloworld!"以上为shell的第一个脚本我们可以在目录中直接vimhello.sh(创建hello.sh,并编辑)输入i后开始编辑#!/bin/bash表示指定该脚本文件应该由哪个解释器来执行。echo表示输出编辑完成后,按ESC,输入wq,保存退出执行脚本可以使用:sh......
  • shell学习
    ⼀、简介1.1Shell环境Shell编程跟java、php编程⼀样,只要有⼀个能编写代码的⽂本编辑器和⼀个能解释执⾏的脚本解释器就可以了。Shell的解释器种类众多,常⻅的有:sh-即BourneShell。sh是Unix标准默认的shell。bash-即BourneAgainShell。bash是Linux标......
  • shell(三剑客)
    正则表达式基本正则表达式元字符^行首定位符$行尾定位符.匹配任意单个字符(单个)*匹配前导符0到多次*和左侧的字符配合左侧字符可以出现0次到多次例如:grep"abc*"/tmp/123结果显示的是ababcabcd…….*任意多字符#会出现所有的内容[]匹配制定范围内的一个......
  • shell(第四章数组和函数)
    变量里面有索引比如:name=dufeng调用echo${name:0:1}输出的是du数字形索引是数组123123文字形索引是关联数组qwupdufeng定义数组数组名=(数组数组数组)数组名=(`cat/etc/passwd`)#反`优先执行数组名=(`ls/home*`)#只要数组可以输出结果数组名=(数组"......
  • shell进阶
    一、探测同网段哪些ip正在被使用[root@rocky8~]#catping.sh!/bin/bash**********************************************************Author:liangweisongQQ:[email protected]:2024-08-31FileName......
  • 【Shell脚本】查看Linux网卡实时流量
    原创唐哥成长的小学生在Linux操作系统中,查询网卡流量并不是特别方便,而且统计方式也不直观,下面给大家整理了一个脚本,直接复制到服务器上运行即可,不存在什么依赖关系。脚本内容将内容保存到一个文件中,文件名称可以自定义,比如:vicatnet.sh将以下内容保存到脚本中#!/bin/......
  • [昌哥IT课堂]使用MySQL Shell 部署沙盒数据库实例详解
     概述:这部分解释了如何使用AdminAPI设置沙盒部署。部署和使用本地MySQL的沙盒实例是开始探索AdminAPI的好方法。在将功能部署到生产服务器之前,您可以在本地测试功能。AdminAPI具有内置功能,用于创建正确配置的沙箱实例,以便在本地部署的情况下与InnoDBCluster、InnoDBClusterS......
  • 用Shell写一个crontab定时任务
    前言很多时候我们有希望服务器定时去运行一个脚本来触发一个操作,比如说定时去备份服务器数据、数据库数据等不适合人工经常做的一些操作这里简单说下shell Shell俗称壳,类似于DOS下的command和后来的cmd.exe。它接收用户命令,然后调用相应的应用程序。作为命令语言,它交互式解释......
  • shell的使用
    第一个shell程序介绍#!/bin/bash#Thisisaverysimpleexampleecho"HelloWorld"#!/bin/bash 表明该文件是一个 BASH 程序,需要由 /bin 目录下的 bash 程序来解释执行。BASH 这个程序一般是存放在 /bin 目录下,如果你的Linux系统比较特别,bash 也有可能被存......
  • Linux之shell脚本变量
    变量是脚本种的一种重要的属性,它可以存储值,这就大大的增加了脚本的灵活性使得脚本的应用更为广泛。自定义变量变量名=值(等号两边不能有空格)在linux内可以定义变量然后用$引用如果要在调用后面加字符之类的则可以使用${变量名}字符环境变量系统帮你定义好的变量例如US......