shell脚本——shell函数详解

2023-10-26

一、shell函数

1、shell函数的概念

  • 将命令序列按格式写在一起
  • 可方便重复使用命令序列

2、shell函数的格式

(1)函数的定义

--------方法一--------
function 函数名
{
	命令序列
}

-------方法二-------
函数名()
{
	命令序列
}

(2)调用函数的方法

函数名 [参数1] [参数2]

示例vim hanshu.sh

3、函数返回值

  • return表示退出函数并返回一个退出值,脚本中可以使用$?变量显示该值
  • 使用原则
    • 1、函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码
    • 2、退出状态码必须是0~255,超出时值将为除以256取余
      在这里插入图片描述
      在这里插入图片描述

4、函数传参

  • 位置变量、预定义变量用的比较多

方法一
在这里插入图片描述
在这里插入图片描述

方法二

  • 可直接在指定路径后添加数值
    在这里插入图片描述
    在这里插入图片描述

5、函数变量的作用范围

  • 函数在shell脚本中仅在当前shell环境中有效
  • shell脚本中变量默认全局有效
  • 将变量限定在函数内部使用local命令

在这里插入图片描述
在这里插入图片描述

6、递归——函数调用自己本身的函数

(1)阶乘 10!

#!/bin/bash
fact(){
        if [ $1 -eq 1 ];then
                echo 1
        else
                temp=$[ $1 - 1 ]
                local res=$(fact $temp)
                echo $[ $1 * $res ]
        fi
}
#####main####
read -p "请输入一个数字:" num
res=`fact $num`
echo $res

[root@localhost ~]# vim digui.sh
[root@localhost ~]# chmod +x *
[root@localhost ~]# ./digui.sh
请输入一个数字:10
3628800
[root@localhost ~]# vim digui.sh
[root@localhost ~]# 
    

在这里插入图片描述
在这里插入图片描述

(2)递归目录

#!/bin/bash

findfile(){
        for f in `ls $1`     #范围为/var/log内所有文件
        do
                if [ -d "$1/$f" ]   #判断是否为目录
                then
                        echo "目录:$2$f"              #添加位置偏移
                        findfile "$1/$f" " $2"      #进行遍历
                else
                        echo "文件:$2$f"  
                fi
        done
}
#为子目录加空格,位置偏移
findfile "/var/log" ""

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7、创建库

[root@localhost ~]# vim ku.sh  ##编辑库函数
[root@localhost ~]# vim test.sh #测试文件
[root@localhost ~]# ./test.sh #指定路径运行

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

shell脚本——shell函数详解 的相关文章

  • 即使退出命令后,Shell 脚本仍继续运行

    我的shell脚本如下所示 bin bash Make sure only root can run our script EUID ne 0 echo This script must be run as root 1 gt 2 exit
  • 在大型文本文件中查找重复记录

    我在一台 Linux 机器 Redhat 上 并且有一个 11GB 的文本文件 文本文件中的每一行包含单个记录的数据 并且该行的前 n 个字符包含该记录的唯一标识符 该文件包含略多于 2700 万条记录 我需要验证文件中不存在具有相同唯一标
  • 打印堆栈指针的值

    如何在 Linux Debian 和 Ubuntu 中用 C 打印堆栈指针的当前值 我尝试谷歌但没有找到结果 一个技巧是简单地将本地地址作为指针打印出来 但它不可移植 甚至无法保证有效 void print stack pointer vo
  • PHP exec - 检查是否启用或禁用

    有没有办法检查 php 脚本是否exec 在服务器上启用还是禁用 这将检查该功能是否确实有效 权限 权利等 if exec echo EXEC EXEC echo exec works
  • 使用 AWK 或 SED 以及以下标签以逗号分隔

    使用 AWK 或 SED 以及下面使用的标签以逗号分隔 BEGIN AccountID BEGIN CallerID BEGIN Billed Account Attributes 1111111 1111111 1111111 END B
  • 安装 Pillow 错误:安装脚本退出并出现错误:命令“x86_64-linux-gnu-gcc”失败,退出状态为 1

    当我尝试安装 Pillow 2 5 3 时 我收到错误 命令 x86 64 linux gnu gcc 失败 退出状态为 1 这是所发生事件的完整日志 http pastebin com 5k2TsyJY 我需要这个库作为另一个 pytho
  • SSL 和 Tkinter 不存在于 Python 3.5.2、Debian Linux 的源代码构建中

    我刚刚将 Python 3 5 2 下载到我的 Debian 机器上并使用以下命令构建它 configure make make test sudo make install 一切正常 但在make test输出中 它显示安装程序由于未安装
  • 为多线程 UDP 客户端执行“close ()”时套接字描述符未释放

    我在下面编写了 UDP 客户端 它基本上生成一个单独的线程来接收数据报 但是数据报仅在主线程中发送 现在 在 Linux 发行版上实例化 udpClient 1 UDP 客户端后按 ctrl D 实现退出循环 围绕 getline 调用 并
  • Linux 缓冲区溢出环境变量

    我一直在审查不同类型的缓冲区溢出 并遇到了一个我不记得为什么会发生的问题 下面的代码是我尝试执行缓冲区溢出的程序 include
  • 更改子进程中的 iostream

    现在 我正在开发一个项目 其中我需要启动一个子进程来使用 C 在 Linux 中执行一个新程序 并且我需要重定向标准输入和输出 就像在 C 中一样 它们是cin and cout 到一个文件 这意味着在子进程中 标准输入和输出都是文件 子进
  • PyGTK+3(PyGObject)创建屏幕截图?

    我过去 3 天在 google 上搜索 如何使用 PyGTK 3 创建屏幕截图 有关于 pyqt pygtk 2 wx 和 PIL 的 gallizion 教程 顺便说一句 我不需要 scrot imlib2 imagemagick 等外部
  • Linux 中不使用 C++ 的 C 异常处理

    Linux 是否提供了 C 语言的异常处理而不求助于 C 或者 实现此类异常处理的最佳方法是什么 目标是避免检查每个调用的函数的返回码 而是执行类似于 C 的线程安全且易于移植的操作 您可以通过为其编写信号处理程序来处理信号 GNU 记录的
  • 为所有图像添加前缀(递归)

    我有一个包含 5000 多张图像的文件夹 全部带有 JPG 扩展名 我想要做的就是递归地向所有图像添加 thumb 前缀 我发现了一个类似的问题 重命名文件和目录 添加前缀 https stackoverflow com questions
  • 验证 BASH 脚本时出现问题 [已关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我在尝试验证 bash 脚本时出现代码 lint 错误 bin bash if eq 0 then printf No argum
  • 在ubuntu 18.04上安装python 2.7

    有没有办法在 Ubuntu 18 04 上安装 Python 2 7 我尝试了这个命令 但它不起作用 sudo apt install python minimal 有没有办法手动安装 我尝试使用 python 2 7 作为不支持 pyth
  • 在 Ubuntu 上运行独立的 ASP.NET Core 应用程序

    我已经发布了一个 ASP NET Core 应用程序作为针对 Ubuntu 的独立应用程序 发布似乎工作正常 我已将这些文件复制到一台漂亮的 Ubuntu 机器上 现在 我如何运行我的应用程序 我的理解是 因为它是一个独立的 NET Cor
  • 为什么 Solaris 汇编器生成的机器代码与 GNU 汇编器在这里不同?

    我为 amd64 编写了这个小汇编文件 对于这个问题来说 代码的作用并不重要 globl fib fib mov edi ecx xor eax eax jrcxz 1f lea 1 rax ebx 0 add rbx rax xchg r
  • 当模式在范围内时使用 sed 打印范围?

    我有一个充满查询的日志文件 我只想查看有错误的查询 日志条目类似于 path to file executing query QUERY SIZE ROWS MSG DURATION 我想打印所有这些东西 但只有当MSG 包含一些有趣的内容
  • 在 UNIX 时间戳 Shell/Bash 中将日期与时区转换

    我需要将日期从格式为 yyyy mm dd hh mm ss TZ 的字符串转换为 UNIX 时间 TZ 时区 到目前为止我所做的是将没有时区的 yyyy mm dd hh mm ss 格式的日期转换为时间戳 dateYMD 2019 2
  • 使用正在运行的进程的共享内存收集核心转储

    核心转储仅收集进程空间 而不收集为进程间通信创建的共享内存 如何使核心转储也包含正在运行的进程的共享内存 设置核心文件过滤器 proc PID coredump filter per http man7 org linux man page

随机推荐

  • 简谈高防CDN

    高防CDN即内容分流网络流量防御 原理就是构建在网络之上的内容分发网络 依靠部署在各地的边缘服务器 通过中心平台的负载均衡 内容分发 调度等功能模块 使用户就近获取所需内容 而不用直接访问网站源服务器 其原理简单的说就是架设多个高防CDN节
  • 2023年03月 C/C++(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

    C C 编程 1 8级 全部真题 点这里 第1题 字符长方形 给定一个字符 用它构造一个长为4个字符 宽为3个字符的长方形 可以参考样例输出 时间限制 1000 内存限制 65536 输入 输入只有一行 包含一个字符 输出 该字符构成的长方
  • 轻松记住大端小端的含义(附对大端和小端的解释)

    或许你曾经仔细了解过什么是大端小端 也动手编写了测试手头上的机器上是大端还是小端的程序 甚至还编写了大端小端转换程序 但过了一段时间之后 当你再看到大端和小端这两个字眼 你的脑中很快浮起了自己曾经做过的工作 却总是想不起究竟哪种是大端 哪种
  • Navicat连接不上sqlserver问题解决(2008R2)

    Navicat连接不上sqlserver问题解决 一 连接SQL Server时出错 未发现数据源名称并且未指定默认驱动程序 1 安装支持文件 因为没有安装连接支持文件 本身navicat其实是支持SQL server的连接的 只不过是因为
  • 目标分割、目标识别、目标检测和目标跟踪的区别

    前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 https www cbedai net linuxcore 1 目标分割 任务是把目标对应的部分分割出来 2 目标检测 检测到图片当中的目标的具体位置 3 目标识别 即是在所有的
  • 选择排序(Selection Sort)-- 初级排序算法

    1 选择排序 Selection Sort 选择排序 Selection sort 是一种简单直观的排序算法 它的工作原理 首先在未排序序列中找到最小 大 元素 存放到排序序列的起始位置 然后 再从剩余未排序元素中继续寻找最小 大 元素 然
  • i春秋CTF-WEB题解(一)

    简述 这次转到了i春秋平台上面练习 和之前一样也是每3道题目就写一篇题解来作为记录 一 爆破 1 百度杯CTF比赛 2017 二月场 题目给的提示是 flag就在某六位变量中 打开题目的链接 能得到一段PHP代码 大致代码解析如下 引入包含
  • C#中Thread.Time的使用

    Thread Time的使用 线程同步处理之一 这个类主要是开启一个线程 然后实现按照指定的周期 定期的调用指定的某个函数 实现了定期调用一个函数或程序的办法 比如想让一个后台程序 定期检查是否收到邮件 或者让一个后台线程定期输出当前时间等
  • 一文讲解单片机、 ARM、 MCU、 DSP、 FPGA、 嵌入式错综复杂的关系

    概述 一文讲解单片机 ARM MCU DSP FPGA 嵌入式错综复杂的关系 首先 嵌入式 这是个概念 准确的定义没有 各个书上都有各自的定义 但是主要思想是一样的 就是相比较PC机这种通用系统来说 嵌入式系统是个专用系统 结构精简 在硬件
  • ESP8266_12 ESP8266客户端模式下的TCP通信

    ESP8266 01搭建开发环境 ESP8266 02程序的编译与下载 ESP8266 03SDK与Makefile的基本用法 ESP8266 04管脚控制与软件定时器 ESP8266 05 ESP8266有几个串口 ESP8266 06硬
  • java 回调函数解读

    模块间调用 在一个应用系统中 无论使用何种语言开发 必然存在模块之间的调用 调用的方式分为几种 1 同步调用 同步调用是最基本并且最简单的一种调用方式 类A的方法a 调用类B的方法b 一直等待b 方法执行完毕 a 方法继续往下走 这种调用方
  • LaTex学习笔记(文档基本结构、编译与特殊符号)

    1 文章开始 文章第一句通常为 documentclass article book report letter等 documentclass x 作为文章排版的依据 x代表排版方式 基本的排版方式有 article 用于文章排版 book
  • epoll与select区别

    select和epoll的区别 面试常考 首先select是posix支持的 而epoll是linux特定的系统调用 因此 epoll的可移植性就没有select好 但是考虑到epoll和select一般用作服务器的比较多 而服务器中大多又
  • BP神经网络参数总结

    BP神经网络参数总结 BP神经网络是一种常用的人工神经网络模型 广泛应用于分类 回归和模式识别等任务中 在进行BP神经网络训练之前 需要对网络的参数进行设置和调整 以获得更好的性能和准确度 下面将对BP神经网络的参数进行总结 并给出相应的源
  • 【线程】详解线程状态(到底是五种还是六种)

    首先我们要知道 在传统 操作系统 的线程模型中线程被分为五种状态 在java线程中 线程被分为六种状态 传统线程模型 操作系统 中线程状态 线程的五种状态 1 新建 new 创建了一个新的线程对象 2 就绪 runnable 调用线程的st
  • python 置信区间_关于置信区间的完整指南和Python示例

    python 置信区间 Confidence Interval CI is essential in statistics and very important for data scientists In this article I w
  • Python Flask 搭建微信小程序后台详解

    前言 近期需要开发一个打分的微信小程序 涉及到与后台服务器的数据交互 因为业务逻辑相对简单 故选择Python的轻量化web框架Flask来搭建后台程序 因为是初次接触小程序 经过一番摸索和尝试 个人觉得的微信小程序与后台的交互有点像aja
  • 矩阵乘法测试

    对于时间的函数 gettimeofday 函数使用方法 http blog csdn net hurmishine article details 60326345 矩阵乘法测试 代码 1 为了试验简单 两个测试矩阵均为n n 当然结果也为
  • C++中的各种进制转换函数汇总

    1 在C中 按指定进制格式输出如下 include
  • shell脚本——shell函数详解

    shell脚本 shell函数详解 一 shell函数 1 shell函数的概念 2 shell函数的格式 1 函数的定义 2 调用函数的方法 3 函数返回值 4 函数传参 5 函数变量的作用范围 6 递归 函数调用自己本身的函数 1 阶乘