首页 > 系统相关 >shell 脚本编程进阶之函数

shell 脚本编程进阶之函数

时间:2023-04-21 22:05:38浏览次数:45  
标签:shell 定义 函数 编程 name echo root 进阶

一、定义函数

1、语法

#语法一:

func_name (){
...函数体...
} #

语法二:

function func_name {
...函数体...
}#语法三:

function func_name () {
...函数体...
}

 在函数中定义本地变量,local  name=NAME

2、查看定义的函数

#查看当前已定义的函数名

declare -F#查看当前已定义的函数定义

declare -f#查看指定当前已定义的函数名

declare -f func_name#查看当前已定义的函数名定义

declare -F func_name

3、删除函数

unset func_name

4、函数调用


函数的调用方式

1可在交互式环境下定义函数

2可将函数放在脚本文件中作为脚本的一部分

3可放在只包含函数的单独文件中

调用:函数只用被调用才会执行,通过定义的函数名去定义函数,函数名出现的地方会被自动替换为函数代码

函数的生命周期:被调用时创建,返回时终止。

5、交互式调用函数

范例:

[root@centos8 ~]#dir() {

ls -l

}

[root@centos8 ~]#dir

total 4 -rw-------. 1 root root 1559 Nov 7 19:33 anaconda-ks.cfg

6、在脚本中定义并使用函数

函数在使用前必须定义,因此应将函数定义放在脚本开始部分,直至shell首次发现它后才能使用,调用函数仅使用其函数名即可

范例:

disable_selinux(){

sed -i.bak 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

setenforce 0

echo "SElinux已禁用已生效"}

disable_firewall(){

systemctl disable --now firewalld &> /dev/null

echo "防火墙已禁用"}

set_ps1() {

echo "PS1='\[\e[1;35m\][\u@\h \W]\\$\[\e[0m\]'" > /etc/profile.d/reset.sh

echo "提示符已修改成功,请重新登录生效"}

set_eth(){

sed -i.bak '/GRUB_CMDLINE_LINUX=/s#"$# net.ifnames=0"#' /etc/default/grub

grub2-mkconfig -o /boot/grub2/grub.cfg &> /dev/null

echo "网络名称已修改成功,请重新启动才能生效"}

PS3="请选择相应的编号(1-6): "MENU='禁用SELinux

关防火墙
修改提示符
修改网卡名
以上全实现
退出'select M in $MENU ;do

case $REPLY in1)

disable_selinux

;;

2)

disable_firewall

;;

3)

set_ps1

;;

4)

set_eth

;;

5)

disable_selinux

disable_firewall

set_ps1

set_eth

;;

6)

break

;;

*)

echo "请输入正确的数字"

esca

done

7、使用函数文件

可以将经常使用的函数存入一个单独的函数文件,然后将函数文件载入shell,再进行调用函数文件名可任意选取,但最好与相关任务有某种联系,例如:functions一旦函数文件载入shell,就可以在命令行或脚本中调用函数。可以使用delcare -f 或set 命令查看所有定义的函数,其输出列表包括已经载入shell的所有函数,若要改动函数,首先用unset命令从shell中删除函数。改动完毕后,再重新载入此文件

实现函数文件的过程:

1. 创建函数文件,只存放函数的定义

2. 在shell脚本或交互式shell中调用函数文件,格式如下

. filename 或 source filename

范例:

[root@centos8 ~]#cat functions

#!/bin/bash

#functions

hello(){

echo Run hello Function

}

hello2(){

echo Run hello2 Function

}

[root@centos8 ~]#. functions

[root@centos8 ~]#hello

Run hello Function

[root@centos8 ~]#hello2

Run hello2 Function

[root@centos8 ~]#declare -f hello hello2

hello ()

{

echo Run hello Function

}

hello2 ()

{

echo Run hello2 Function

}

8、函数返回值

函数的执行结果返回值:

使用echo等命令进行输出

函数体中调用命令的输出结果

函数的退出状态码:

默认取决于函数中执行的最后一条命令的退出状态码

自定义退出状态码,其格式为:

return

return 0

return 1-255

从函数中返回,用最后状态命令决定返回值

无错误返回

有错误返回

9、环境函数

类拟于环境变量,也可以定义环境函数,使子进程也可使用父进程定义的函数

定义环境函数:

export -f function_name

declare -xf function_name

10、函数变量

变量作用域:

普通变量:只在当前shell进程有效,为执行脚本会启动专用子shell进程;因此,本地变量的作用

范围是当前shell脚本程序文件,包括脚本中的函数

环境变量:当前shell和子shell有效

本地变量:函数的生命周期;函数结束时变量被自动销毁

注意:

如果函数中定义了普通变量,且名称和局部变量相同,则使用本地变量

由于普通变量和局部变量会冲突,建议在函数中只使用本地变量




标签:shell,定义,函数,编程,name,echo,root,进阶
From: https://blog.51cto.com/gttwangyanjun/6214230

相关文章

  • Windterm-SSH/Sftp/Shell/Telnet/Serial 客户端
    如果图片查看不了的话,请关注公众号@生活处处有BUGWindTerm是一款开源免费、跨平台SSH/Sftp/Shell/Telnet/Serial客户端,即远程连接工具,还跨平台,支持Windows、Linux和macOS。特征实现了SSHv2、Telnet、RawTcp、Serial、Shell协议。会话认证时支持SSH自动执行。支......
  • 编程打卡:C语言趣味编程习题做
    编程打卡:C语言趣味编程习题做完数问题描述完数是因子相加等于它本身的数字,求一个范围内的完数。设计思路遍历这个范围内的数字,求它的因子,然后判断是否为完数即可。流程图graphA[开始]-->B[inputN,i=2]-->C{i<=N}--Yes-->D[j=1,sum=0]-->E{j<=i/2}--Yes-->F{i%j==0}--Yes--......
  • shell与export命令
    围绕以下几个问题来学习export命令:1.什么是export命令?2.为什么要用export命令?3.怎么使用export命令?1.什么是export命令?♦ 用户登录到Linux系统后,系统将启动一个用户shell。在这个shell中,可以使用shell命令或声明变量,也可以创建并运行shell脚本程序。运行shell脚本程序......
  • 实验3 控制语句与组合数据类型应用编程
    1.实验任务1task1.py1importrandom23print('用列表存储随机整数:')4lst=[random.randint(0,100)foriinrange(5)]5print(lst)67print('\n用集合存储随机整数:')8s1={random.randint(0,100)foriinrange(5)}9print(s1)1011print(......
  • MySQL Shell 使用报错 SyntaxError: Unexpected identifier
    文章目录一、问题报错二、解决办法一、问题报错MySQLShell8.0.23Copyright(c)2016,2021,Oracleand/oritsaffiliates.OracleisaregisteredtrademarkofOracleCorporationand/oritsaffiliates.Othernamesmaybetrademarksoftheirrespectiveowners.T......
  • vue全家桶进阶之路50:Vue3 环境变量+跨域设置实例
    使用.env加后缀的方式来建立某个模式下的环境变量,例如:项目根目录新建两个环境变量文件(development开发环境和production生产环境):.env.development.env.production 在新建的两个环境变量文件中设置相同的环境变量名:VUE_APP_BASE_API环境变量名称必须以"VUE_API_"+名称......
  • WCF教程_编程入门自学教程_菜鸟教程-免费教程分享
    教程简介Windows通讯开发平台(WindowsCommunicationFoundation,简称WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Windows通讯开发平台。整合了原有的windows通讯的.netRemoting,WebService,Socket的机制,并融合有HTTP和FTP的相关技术。是Windows平台上开发分布......
  • Linux Shell常用shell命令
    Linux常识Linux目录介绍/usr系统级的目录,可以理解为C:/Windows/,/usr/lib可理解为C:/Windows/System32。/usr/local用户级的程序目录,可以理解为C:/ProgremFiles/。用户自己编译的软件默认会安装到这个目录下。/usr/bin:存放的是系统使用的应用程序。/opt用户级的程......
  • 编程一小时2023.4.21
    1.classCar:publicVehicle{public:Car(stringno,intguest,intweight):Vehicle(no){m_no=no;m_guest=guest;m_weight=weight;}virtualintfee(){return(m_guest*8+m_weight*2);}private:stringm_no;intm_guest,m_weight;};classTruck:publicVehicle{public:Truck(......
  • 网络编程-UDP通信程序
    网络编程-UDP通信程序InetAddressaddress=InetAddress.getByName("Dinesaw");System.out.println("主机名:"+address.getHostName());System.out.println("IP地址:"+address.getHostAddress());UDP发送数据Java中的UDP通信UDP协议是一种不可靠的网络协议,它在通信的......