shell函数

news/2024/11/29 23:32:10/

shell函数

功能

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

一:函数的定义方法

方法一

function 函数名 {
命令序列
}

举例:

function user {useradd $nameecho 123456 | passwd --stdin $name

方法二

函数名() {   #注意函数名后面那个小括号里面什么都不要写,固定格式
命令序列
}

举例:

user() {useradd $nameecho 123456 | passwd --stdin $name
}
################main#############'
read -p "输入你要创建的用户名" name
user 

在这里插入图片描述

二:获取shell函数的返回值

方法一(不常用)

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

  • 函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码
  • 退出状态码必须是0~255,超出时值将为除以256取余数

示例:

在这里插入图片描述

在这里插入图片描述

方法二 (常用)

在函数内用echo输出值,在函数体外可用 变量=S(函数名) 获取函数的返回值
在这里插入图片描述

在这里插入图片描述

三:函数传参

1:位置参数在函数体内

  • 函数体内部的$1 ,$2 代表的是调用函数时,函数后面跟的位置参数在函数体内部的
  • $#代表调用函数时,函数后面跟的参数个数在函数体内部的
  • $@ $*代表调用函数时,函数后面跟的所有参

2:位置参数在函数体外

  • 函数体外的$1 $2 代表的是执行脚本时,脚本后面跟的位置参数
  • 在函数体外时 $# 代表脚本后面跟的参数个数
  • 在函数体外时 $@ $*代表脚本后面跟的所有参数

3:特殊情况 $0

  • 不管在函数体内还是在函数体外,$0都代表脚本本身

示例:
在这里插入图片描述
在这里插入图片描述

四:函数变量的作用范围:

  • 函数默认只能脚本内的shel1环境有效(使用source执行脚本,也会影响系统的当前shel环境)
  • 脚本中的变量默认全局有效(即函数体内外都有效)
  • 在函数体内执行 local 变量 ,可将变量限定在函数体内部使用,外部就不能用
myfun() {echo $namelocal name=lisiecho $name}###main#########name=zhangsan
myfun
echo $name#local限定的函数内,函数内的变量成为了局部变量(新的变量,只在函数体内有效;是局部变量,退出函数后就会失效)

在这里插入图片描述
在这里插入图片描述
拓展:

1、linux的全局变量与局部变量

  • 全局变量:作用于整个操作系统内所有用于的shell环境内,
  • 局部变量:变量只作用于当前shell环境内

2、shell脚本的全局变量与局部变量

  • 全局变量:作用于shell脚本当前的整个shell环境中,包括函数体内或者体外。
  • 局部变量:作用于shell脚本当前的shell环境中,仅限制于某个函数体内。

五:递归

函数调用自己本身的函数,直到满足不再递归的条件。

如何使用函数的递归实现阶乘

阶乘含义:5的阶乘即 “ 5!”=5 * 4 * 3 * 2 * 1 。

如何使用函数的递归实现阶乘:

#使用函数的递归实现阶乘
fact() {if [ $1 -eq 1 ]thenecho 1elselocal temp=$[ $1 - 1 ]local result=$(fact $temp)
#使用local规定全局变量,用来防止函数内变量与主代码区变量相冲echo $[$1 * $result ]fi
}
############## main #############
read -p "请输入:" n
result=$(fact $n)
echo $result

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

通过函数实现递归查看目录

#!/bin/bash
#使用函数递归目录/var/log,如果是文件直接输出文件名,如果>是目录则输出目录名且输出此目下录的所有目录和文件名
listf() {for d in $(ls $1)doif [ -d "$1/$f" ]thenecho "$2目录$f"listf "$1/$f" "  $2"elseecho "$2文件$f"fidone
}
#######################main###########
listf "/var/log" ""

在这里插入图片描述

在这里插入图片描述
拓展实验:通过脚本输出环境变量PATH所包含的所有目录以及其中的子目录和所有不可执行文件
在这里插入图片描述
拓展:将一个点分十进制格式的IP地址转换成点分二进制格式
在这里插入图片描述

六:函数库

先定义一个函数库
在这里插入图片描述

将函数库文件加载到当前脚本的shell
在这里插入图片描述
执行脚本即可使用函数库里面的已经定义好的函数
在这里插入图片描述


http://www.ppmy.cn/news/62717.html

相关文章

ASN.1-PKCS10-x509

在国际标准ITU-T X.690 《Information technology – ASN.1 encoding rules: Specification of Basic Encoding Rules (BER), Canonical Encoding Rules (CER) and Distinguished Encoding Rules (DER)》中定义了ASN.1编码规则。对于一般数据类型(比如Integer、octe…

惊现数据库误操作后,看这家银行如何打造“零盲区”运维安全

第三方运维人员数据库误操作致业务中断 堡垒机凸显短板 这家银行如何破局? 走在数字化转型前沿的银行业,不断增加的IT资产、业务系统,给IT运维提出了更高的挑战。银行运维的核心之一在于数据安全、系统稳定,面临着庞杂的运维场景…

Java中的基本容器知识你真的了解过吗?

前言:尽量使用简单易懂的通俗语言让大家初步了解各个重要的知识点。博学之,审问之,慎思之,明辨之,笃行之。 一、容器(Collection) Collection容器其实是用来存储独立元素的各种数据结构&#xf…

iphone死机屏幕没反应?可以用这2种办法解决!

iPhone用的时间长了,难免不会遇到卡屏、死机的情况,如果出现这种状况我们应该怎么办呢,下面小编整理出来了几招解决方法,教大家解决iPhone卡屏、死机的问题。 一、强制重启 如果自己的iPhone一直处于卡屏无法操作,或死…

L4公司进军辅助驾驶,放话无图也能跑遍中国

作者 | Amy 编辑 | 德新 高阶智能驾驶走向规模量产,高精地图成为关键的门槛之一。今年,多家车企和智驾公司都喊出「不依赖高精地图,快速大规模落地」的口号。 华为、小鹏、元戎以及毫末等,可能是最快在国内量产 无高精图智…

TensorRT入门实战,TensorRT Plugin介绍以及TensorRT INT8加速

文章目录 一、TensorRT介绍,工作流程和优化策略TensorRT是什么TensorRT的工作流程TRT优化策略介绍 二、TensorRT的组成和基本使用流程三、TensorRT的基本使用流程四、TensorRT Demo代码 : SampleMNISTCaffe Parser方式构建 五. TensorRT Plugin基本概念工作流程API介绍Dynamic …

【Android入门到项目实战-- 9.1】—— 传感器的使用教程

目录 传感器的定义 三大类型传感器 1、运动传感器 2、环境传感器 3、位置传感器 传感器开发框架 1、SensorManager 2、Sensor 3、SensorEvent 4、SensorEventListener 一、使用传感器开发步骤 1、获取传感器信息 1)、获取传感器管理器 2)、获取设备的传感器对象列…

探索语音识别技术:从自动翻译到智能客服

漫游语音识别技术——带你走进语音识别技术的世界 语音识别是指将人类语言转化为计算机可处理的数字代码。在信息技术的发展史上,语音识别技术一直是人工智能领域的热门话题。近年来,随着人工智能技术的不断发展,语音识别技术也逐渐走进我们的…