【shell函数】

news2024/12/21 10:15:14

目录

  • 一、shell函数
    • 1、shell函数的定义
  • 二、函数传参
  • 三、阶乘
  • 四、函数实验题目


一、shell函数

使用函数可以避免代码重复

使用函数可以将大的工程分割为若干小的功能模块,代码的可读性更强

1、shell函数的定义

函数返回值:
return表示退出函数并返回一个退出值,脚本中可以用$?变量显示该值使用原则:

1、在函数内用return退出函数开返回函数的值,在函数外用echo $?获取返回值,注,返回值的范用只能在0~255,超过部分需除以256取余

1】
function 函数名 {            #定义一个函数
           命令序列      
}

function db1 {
  read -p "请输入一个整数: " value
  return $[ $value * 2 ]             #执行体内的函数

}

db1
echo $?

在这里插入图片描述

2、在函数内用echo输出值,在函数体外可用 变量=$(函数名) 获取函数的返回值

2】
函数名() {
           命令序列
}

db1 () {
    read -p "请输入一个整数: " value
    echo $[ $value * 2 ] 
}

result=`db1`
echo $result

在这里插入图片描述

二、函数传参

使用函数来实现加法计算

#!/bin/bash

#定义参数
sum1() {
  #函数体内部的$1 $2 代表的是调用函数时,函数后面跟的位置参数
  sum=$[$1 + $2]
  echo $sum
}

#调用函数
read -p "请输入第一个参数: " first
read -p "请输入第二个参数: " second

#函数体外的$1 $2 代表的是执行脚本时,脚本后面跟的位置参数
sum1 $first $second

#$first表示代表的第一个位置参数 $1
#$second表示代表的第二个位置参数 $2

在这里插入图片描述

使用函数来显示参数

#!/bin/bash

#定义函数
sum2() {
   #函数体内部的$1 $2 代表的是调用函数时,函数后面跟的位置参数
   sum=$[$1 - $2]
   echo $sum
   echo "在函数体内部的\$#代表调用函数时,函数后面跟的参数个数,当前函数后面有$#个参数"
   echo "在函数体内部的 \$@代表调用函数时,函数后面跟的所有参数,当前函数后面的参数有: $@"
   echo "在函数体内部,\$0代表$0"

}

echo "在函数体外时,\$#代表脚本后面跟的参数个数,当前脚本后面有$#个参数"
echo "在函数体外时,\$@代表脚本后面跟的所有参数,当前脚本后面参数有: $@"
echo "在函数体外. \$0代表$0"


#调用函数
#函数体外的$1 $2 代表的是执行脚本时,脚本后面跟的位置参数
 sum2 $2 $1

在这里插入图片描述

使用函数来查看执行的顺序
脚本中的变量默认全局有效(即函数体内外都有效)

#!/bin/bash

myfun() {
  echo $name

  name=lisi

  echo $name
}

#####main######

name=zhangsan

myfun

echo $name

在这里插入图片描述

在函数体内执行 local 变量 ,可将变量限定在函数体内部使用

#!/bin/bash

myfun() {
  echo $name    #先输出name的值

  local name=lisi  #加上一个local把函数体内的值限制在函数体内使用,不会显示在函数体内(局部变量)

  echo $name
}

#函数值在没有调用前是不会执行的

#####main######

name=zhangsan  #全局有效的变量

myfun    #调用myfun这个函数

echo $name    #看里面是不是全局变量,如果是局部变量,就输出体外的变量值

在这里插入图片描述

将全局变量删掉后,可以发现写入的只有局部变量的值,其他的值都为空

#!/bin/bash

myfun() {
  echo $name

  local name=lisi       #使用local时只能在函数体内使用

  echo $name
}


#####main######


myfun

echo $name

在这里插入图片描述

三、阶乘

使用函数来实现递归阶乘

#!/bin/bash
#使用函数的递归实现阶乘

fact() {
  if [ $1 -eq 1 ]
  then
    echo 1
  elif [ $1 -gt 1 ]
  then
    local tmp=$[$1 - 1]       #迭代过程
    local res=$(fact $tmp)    #递归过程
    echo $[$1 * res]          #用本身来乘以递归的结果
          
  else
    echo "输入的值无效。请输入大于等于1的整数!"
  fi
}

#####main#####

read -p "请输入一个大于等于1的整数:" num
res=$(fact $num)
echo "$num的阶乘值为$res"

在这里插入图片描述

在这里插入图片描述

使用函数递归来查看目录下的文件,并且有层级关系

#!/bin/bash
#使用函数递归目录/var/log,如果是文件直接输出文件名,如果是目录则输出目录名且输出此目录下的所有目录和文件名

listf () {
  for f in $(ls $1)   #$1/var/log/下的子目录
  do
    if [ -d "$1/$f" ]    #用if语句来判断是否为目录
    then
      echo "$2目录$f"
      listf "$1/$f" "  $2"   
      #使用空格来缩进,查到到所有目录,直到文件才执行else命令
    else
      echo "$2文件$f"  
    fi

  done

}

listf "/var/log" " "  #使用空格键来分割目录和文件,变的更加清晰可见

在这里插入图片描述

四、函数实验题目

1、通过脚本输出环境变量PATH所包含的所有目录以及其中的子目录和所有不可执行文件

#!/bin/bash
#通过脚本输出环境变量PATH所包含的所有目录以及其中的子目录和所有不可执行文件

#定义一个遍历PATH环境变量的函数
list_path() {
    IFSB=$IFS
    IFS=$IFS':'
    for F in $PATH
    do
        echo $F
    done
    IFS=$IFSB
}

#定义一个递归函数
listf() {
    for F in $(ls $1)   #写入绝对路径,且这个不能写出路径,防止进入死循环
    do
        if [ -d "$1/$F" ]
        then
            echo "$2$F"
            listf "$1/$F" "  $2"
        else
            if [ ! -x "$1/$F" ]   #判断有没有可执行权限,有的话就输出
            then
                echo "$2$F"
            fi
        fi
    done
}

######main######
#获取PATH变量的所有目录的列表
folder=$(list_path)    #获取所有变量的path目录

#遍历PATH变量的目录,并用函数递归查询
for path in $folder   #使用for循环来遍历查找的目录
do
    echo $path      
    listf "$path"  "  "  #加上空格更加清晰看出不可执行权限的文件

done

在这里插入图片描述

2、将一个点分十进制格式的IP地址转换成点分二进制格式
#比如 255.255.255.255 --> 11111111.11111111.11111111.11111111

#!/bin/bash
#将一个点分十进制格式的IP地址转换成点分二进制格式
#比如 255.255.255.255   -->  11111111.11111111.11111111.11111111

#定义一个用于十进制转换为二进制的函数
switch_bin() {
    NUM=$1
    for i in {1..8}
    do
        SUM=$[NUM % 2]$SUM  #取余数,结果拼接到a前,完成余数倒排
        let NUM/=2    #将num除二,进入下一个循环
    done
    echo $SUM
}    

#定义一个用于分割IP的函数
SPT() {
    IP=$1
    for i in {1..4}
    do
        num=${IP%%.*}        
        IP=${IP#*.}
        BIN=$(switch_bin num)
        echo -n $BIN.
    done

}

#####main#####
read -p "请输入一个合法IP:" INIP
res=$(SPT $INIP)    #使用SPT函数,下面的函数可以调用上面的函数
echo ${res%.*}

3、创建一个函数库,可以方便的使用函数脚本

jiafa() {
    echo $[$1 + $2]
}

jianfa() {
    echo $[$1 -$2]
}

chengfa() {
    echo $[$1 * $2]
}

chufa() {
   if [ $2 -eq 0 ];then
       echo "除数不可为0"
   else
       echo $[$1 / $2]
   fi
}

fact() {
  if [ $1 -eq 1 ];then
    echo 1
  elif [ $1 -gt 1 ];then
    local tmp=$[$1 - 1]
    local res=$(fact $tmp)
    echo $[$1 * res]
  else
    echo "输入的值无效。请输入大于等于1的整数!"
  fi
}

4、使用函数库来实现加减乘除

#!/bin/bash

#加载函数库文件到当前脚本的shell
. /root/ky111/funcs

value1=10
value2=5

res1=$(jiafa $value1 $value2)
res2=$(jianfa $value1 $value2)
res3=$(chengfa $value1 $value2)
res4=$(chufa $value1 $value2)
res5=$(fact $value1 $value2)

echo "加法的结果为$res1"
echo "减法的结果为$res2"
echo "乘法的结果为$res3"
echo "除法的结果为$res4"
echo "阶乘的结果为$res5"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/505302.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux | 学习笔记(适合小白)

操作系统概述: 计算机是由硬件和软件这两个主要部分组成的操作系统是软件的一类,主要作用是协助用户调度硬件工作,充当用户和计算机硬件之间的桥梁常见的操作系统:PC端:Windows,Linux,MacOS&…

ShardingSphere系列一(MySQL主从架构及读写分离实战(搭建主从集群、MySQL高可用方案MHA、分库分表概念))

文章目录 1. 搭建主从集群1.1 概念1.2 同步的原理1.3 搭建主从同步实战1.3.1 配置master主库1.3.2 配置slave从库1.3.3 主从集群测试 1.4 主从同步扩展1.4.1 主库同步与部分同步(同步范围限制)1.4.2 读写分离配置1.4.3 其他集群方式 1.5 GTID同步集群1.6…

Linux的这七大认识误区,你千万别有!

导读本文罗列了大家对Linux的七大认识误区,看看其中那个是你也出现过的。千万别让这些先入为主的观点断送了你体验新事物的机会。 Linux的受众群体并不大。对还是错? 错!大错而特错。 我承认,Linux的实际用户数量很难统计,因为…

【1.JS基础-JavaScript的基本语法和数据类型】

1.JavaScript的编写方式 2 JavaScript的交互方式 3 Chrome的调试工具 4 变化数据的记录 – 变量 如果一个变量有声明,但是没有赋值,那么默认值是undefined 5 JavaScript的数据类型 typeof操作符 6 Number类型 number 类型代表整数和浮点数。 ◼ isNaN…

举一反三学python(12)—制作简易计算器

下图为简易、实用的计算器的效果图,今天展示用百行代码完成。 一、导入模块 import tkinter as tk 二、整体布局 win tk.Tk() # 实例化一个窗体对象 win.title(简易计算器) # 窗口标题 win.geometry(295x280) # 窗…

ESP8266图形播放器 + 天气时钟显示项目更新

<fontcolor=green>ESP8266图形播放器 + 天气时钟显示项目更新 🎞原项目播放效果演示:https://www.ixigua.com/6968269356820070912?logTag=f37e7f1f5cefa9876746✨由于有些库的更新以及API调用接口的失效,特此更新,内容上做了精简和优化。⚡由于所调用的库比较多,…

IPWorks VoIP 2022.0.8505 C++ Edition

IPWorks VoIP IPWorks VoIP 2022 C Edition 支持常见 SIP 和 IVR 操作的简单 VoIP 库。 网络语音组件 IPWorks VoIP 提供 SIP 和 IVR 组件&#xff0c;旨在促进 CTI 应用中的常见 VoIP 操作。快速集成功能&#xff0c;以根据您的自定义 IVR 菜单建立拨出呼叫、接听来电和路由呼…

kt:reified和sam转换(Single Abstract Method Conversions)

什么是refied关键字 ​由于我们都知道Kotlin和Java一样都存在着泛型擦除问题&#xff0c;而Kotlin它知道Java所带来的这个问题&#xff0c;所以对此Kotlin留了一个后门&#xff0c;就是通过inline函数保证使得泛型类的类型实参在运行时能够保留&#xff0c;这样的操作 Kotlin 中…

使用OpenCV部署全景驾驶感知网络YOLOP

开源项目 MCnet 是一个神经网络模型&#xff0c;用于实现车辆视觉感知的任务&#xff0c;比如车道线检测、行驶区域分割和物体检测等。MCnet 的全称是 Multitask CNN&#xff0c;它在单个神经网络模型中集成了多个任务的网络结构&#xff0c;可以同时对输入图像进行多个任务的…

Day964.从持续构建到持续集成 -遗留系统现代化实战

从持续构建到持续集成 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于从持续构建到持续集成的内容。 如何修改后的代码可以“火速”部署到生产环境里&#xff0c;这样才能提高整个端到端的交付效率&#xff0c;让每次改动工作都能及时得到反馈&#xff0c;尽快验证…

看火山引擎DataLeap如何做好电商治理(二):案例分析与解决方案

接上篇&#xff0c;以短视频优质项目为例&#xff0c;火山引擎DataLeap平台治理团队会去对每天发布的这种挂购物车车短视频打上标签&#xff0c;识别这些短视频它是优质的还是低质的&#xff0c;以及具体原因。一个视频经过这个模型识别之后&#xff0c;会给到奖惩中心去做相应…

聊一聊 用 dotnet-trace 调查 lock锁竞争

一&#xff1a;背景 1. 讲故事 最近在分析一个 linux 上的 dump&#xff0c;最后的诱因是大量的lock锁诱发的高频上下文切换&#xff0c;虽然问题告一段落&#xff0c;但我还想知道一点信息&#xff0c;所谓的高频到底有多高频&#xff1f;锁竞争到底是一个怎样的锁竞争&…

将训练好的模型保存在服务端的三种办法

刚刚在完善我书中第七章案例的文档时&#xff0c;需要将训练好的模型存储在服务端&#xff0c;方便小伙伴们来使用该模型&#xff0c;这里我提供三种办法&#xff1a; 直接从我的个人网站中加载&#xff1b;通过python启动一个文件下载服务器&#xff1b;使用微信小程序云存储…

windows10+detectron2完美安装教程

文章目录 前言下载detectron2安装Visual Studio 2019修改代码 前言 需要下载detectron2的github项目&#xff0c;安装vs2019 (强烈建议这个版本&#xff0c;其他的版本需要做更多地操作才能成功安装)&#xff0c;默认其他环境没问题。 下载detectron2 链接&#xff1a;https…

【来点小剧场--爪哇岛寻宝】java实现网络编程,写一个简易的回显服务程序

作者&#xff1a;困了电视剧 专栏&#xff1a;《JavaEE初阶》 文章分布&#xff1a;这是一篇关于网络编程的文章&#xff0c;在这篇文章中我会剖析一段回显服务程序的执行步骤和代码编程&#xff0c;希望对你有所帮助&#xff01; 目录 客户端 服务端 总结 客户端 现在我们…

Postman完全卸载步骤

一、卸载应用程序 我们首先正常右键点击卸载通过windows程序卸载功能来卸载postman应用程序。 二、删除文件 &#xff08;1&#xff09;删除AppData》Roadming下的postman文件夹 &#xff08;2&#xff09;删除AppData》Roadming》\Microsoft\Windows\Start Menu\Programs下的p…

态势感知与信质、信量

未来的新智能是人机环境系统智能&#xff0c;而人机融合的态势感知是其关键&#xff0c;简单地说&#xff0c;态势感知&#xff08;situation awareness&#xff09;就是智能体在“一定时间和空间环境中的元素的感知&#xff0c;对它们的含义的理解&#xff0c;并对他们稍后状态…

uni——调用子组件失败解决方法($nextTick)

案例说明 调用子组件内的方法或者属性赋值报错的 this.$refs.goodsOrder.list [ ]解决代码 在外层包裹this.$nextTick(() > { 数据 }) this.$nextTick(() > {this.$refs.goodsOrder.list [] })

【JAVA面试】JVM

提示&#xff1a;文章先作为初版&#xff0c;等后续时间充足后&#xff0c;补充更深的内容 文章目录 JVM一、垃圾回收算法二、什么是STW三、JVM参数四、JVM内存模型 JVM 一、垃圾回收算法 JVM中的垃圾回收算法可以分为两种类型&#xff1a;基于引用计数的垃圾回收算法和基于可…

国考省考行测:数字推理题,趋势平缓作差,趋势陡峭看平方乘积,根号数列平方,分数小数拆开看

国考省考行测&#xff1a;数字推理题&#xff0c;趋势平缓作差&#xff0c;趋势陡峭看平方乘积&#xff0c;根号数列平方&#xff0c;分数小数拆开看 2022找工作是学历、能力和运气的超强结合体! 公务员特招重点就是专业技能&#xff0c;附带行测和申论&#xff0c;而常规国考…