【shell脚本百炼成魔】shell脚本之函数实战

news2024/7/2 3:29:14

前言

在这里插入图片描述

文章目录

  • 前言
  • 函数的概念
  • 函数的基本语法
    • 1.使用关键字 function:
    • 2.直接使用函数名和大括号:
  • 函数的简单案例
    • 案例一,欢迎函数
    • 案例二:购物清单
  • 函数的传参
    • 1. 位置参数
    • 2. 命令替换
    • 3. 数组参数
  • 函数的返回值
    • 1. 判断函数的执行结果
    • 2. 函数的结果赋值给变量
    • 3. 作为其他函数的输入
  • shell脚本函数的作用域
    • 1. 局部变量
    • 2. 全局变量
  • 使用函数创建自定义命令
  • 总结

函数的概念

在Shell脚本中,函数是一种将一系列命令和逻辑封装起来以便重复使用的方式。

函数的基本语法

在Shell脚本中,可以使用如下方法来定义函数:

1.使用关键字 function:

function function_name {
# 函数体
}

这种方式是较为传统的函数定义方式,在大多数的Shell环境中都被支持。

2.直接使用函数名和大括号:

function_name {
# 函数体
}

这种方式是较为简洁的函数定义方式,不需要使用关键字 function,直接将函数名与大括号括起来即可。

函数的简单案例

案例一,欢迎函数

# 使用关键字 function
function greet {
    echo "Hello, $1!"
}

# 使用直接定义函数名和大括号
bye() {
    echo "Goodbye, $1!"
}

$1是一个位置变量。

执行结果:

./greeting.sh itlaoxin

案例二:购物清单


[root@laoxin21 test]# cat list.sh 
#!/bin/bash
list(){
        cat <<END
        1.apple
        2.banana
        3.pear
        4.orange
        
        please slect one that you like:
END
}
list
[root@laoxin21 test]# 
root@laoxin21 test]# bash list.sh 
        1.apple
        2.banana
        3.pear
        4.orange
        
        please slect one that you like:

函数的传参

函数的传参有以下几种形式:

  • 位置参数
  • 命令替换
  • 数组参数

1. 位置参数

位置参数:使用位置参数传递参数给函数。位置参数是通过数字 $1、$2、$3 等来引用的,分别表示传递给函数的第一个参数、第二个参数、第三个参数,以此类推

#!/bin/bash

greet() {
    echo "Hello, $1! Your age is $2."
}

greet "John" 25

2. 命令替换

命令替换:使用命令替换语法 $() 或 反引号 ````来传递命令的输出作为参数

#!/bin/bash

greet() {
    echo "Hello, $(whoami)!"
}

greet

这里的$(whoami) 获取当前用户,并通过echo输出问候语

3. 数组参数

把数组作为参数传递给函数

#!/bin/bash

print_array() {
    local arr=("$@")  # 将所有参数赋值给数组变量 arr
    for element in "${arr[@]}"; do
        echo "$element"
    done
}

my_array=("apple" "banana" "cherry")
print_array "${my_array[@]}"

print_array函数接受一个数组参数,并使用 for 循环遍历该数组并输出每个元素。
在使用数组参数时,需要使用 "${array[@]}" 来传递数组的所有元素。

函数的返回值

一般shell脚本的返回值用return

1. 判断函数的执行结果

通过返回值可以判断函数的执行情况。一般约定,返回值为 0 表示函数执行成功,非零值表示函数执行失败或存在错误

#!/bin/bash

is_file_exists() {
    local file="$1"
    if [ -f "$file" ]; then
        return 0  # 文件存在,返回成功
    else
        return 1  # 文件不存在,返回失败
    fi
}

check_file() {
    local file_name="$1"
    is_file_exists "$file_name"
    if [ $? -eq 0 ]; then
        echo "File exists."
    else
        echo "File does not exist."
    fi
}

check_file "example.txt"

2. 函数的结果赋值给变量

有时候,函数需要返回一些计算结果、状态信息等。通过将函数的返回值赋值给变量,可以方便地在脚本中后续使用这些结果。

#!/bin/bash

calculate_sum() {
    local num1=$1
    local num2=$2
    local sum=$((num1 + num2))
    return $sum
}

result=0
calculate_sum 5 10
result=$?
echo "Sum: $result"

calculate_sum函数计算两个数的和,并通过 return 返回结果。

3. 作为其他函数的输入

函数的返回值可以作为其他函数的输入参数,实现不同函数之间的数据传递和协作

#!/bin/bash

get_full_name() {
    local first_name="$1"
    local last_name="$2"
    local full_name="$first_name $last_name"
    echo "$full_name"
}

greet() {
    local name="$1"
    echo "Hello, $name!"
}

first_name="John"
last_name="Doe"
full_name=$(get_full_name "$first_name" "$last_name")
greet "$full_name"

get_full_name 函数接受名字的姓和名作为参数,并返回完整的名字。然后,我们将函数的返回值赋值给变量 full_name,并将其作为参数传递给 greet 函数,实现对完整名字的问候。

shell脚本函数的作用域

函数内部的变量具有局部作用域,意味着它们在函数外部是不可见的。这是由Shell解释器的作用域规则决定的

1. 局部变量

局部变量:在函数内部声明的变量默认是局部变量,意味着它们只在函数内部可见和使用。这样的变量不能被函数外的代码访问

#!/bin/bash

my_function() {
    local my_var="Hello"
    echo "Inside function: $my_var"
}

my_function
echo "Outside function: $my_var"  # 输出为空,无法访问函数内部的局部变量

此处: my_var 是在函数内部使用 local 关键字声明的局部变量。它只在函数内部可见,在函数外部无法访问

2. 全局变量

全局变量:在函数内部也可以访问和修改全局变量,这些变量在脚本的任何地方都是可见和可用的。全局变量的作用域超出了函数的范围。

#!/bin/bash

global_var="Hello"  # 全局变量

my_function() {
    echo "Inside function: $global_var"
    global_var="World"  # 修改全局变量的值
}

my_function
echo "Outside function: $global_var"  # 输出 "World",函数内修改了全局变量

global_var是在函数外部定义的全局变量。函数内部可以访问和修改这个全局变量的值,并且函数执行后对全局变量的修改在函数外部是可见的。

在Shell脚本中没有块级作用域的概念。只有函数内部可以创建局部变量,而在其他地方(如if语句、for循环等)声明的变量仍然具有全局作用域。

总结: 对于需要在函数间共享数据的情况,可以使用全局变量或通过参数传递。使用local关键字可以将变量限定在函数的作用域内,避免了全局命名空间的冲突。确保在函数内外使用变量时,理解其作用域和可见性以避免意外的行为

使用函数创建自定义命令

1.创建一个Shell脚本文件,例如 welcome.sh。

2.在脚本文件中定义一个名为 welcome_message 的函数,用于输出欢迎信息。

   #!/bin/bash

   welcome_message() {
       echo "欢迎来到沐风晓月的csdn博客"
   }

3.添加可执行权限给脚本文件。

   chmod +x welcome.sh

4.将脚本文件放置在系统命令搜索路径中。

   smv welcome.sh /usr/local/bin/

5.在用户的 Shell 配置文件(例如 .bashrc 或 .bash_profile)中添加以下内容,以在用户登录时调用自定义命令。

   welcome_message

这样,在每次用户登录系统时,将自动执行 welcome_message 函数,并显示欢迎信息。

总结

以上就是shell脚本中函数实战的全部内容,如果对你有用,记得留言哦

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

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

相关文章

SVNKit 1.10.8: svn add和svn commit方法总结

SVNKit 1.10.8: svn add和svn commit方法实现总结&#xff1a; doAdd(java.io.File path, boolean force, boolean mkdir, boolean climbUnversionedParents, SVNDepth depth, boolean depthIsSticky, boolean includeIgnored, boolean makeParents) 参数是的含义及作用&…

实现淘宝母婴订单实时查询和可视化|Flink-Learning实战营

为进一步帮助开发者学习使用 Flink&#xff0c;Apache Flink 中文社区近期发起 Flink-Learning 实战营项目。本次实战营通过真实有趣的实战场景帮助开发者实操体验 Flink&#xff0c;课程包括实时数据接入、实时数据分析、实时数据应用的场景实。并结合小松鼠助教模式&#xff…

K8s组件:etcd安装、使用及原理(Linux)

K8s组件&#xff1a;etcd安装、使用及原理&#xff08;Linux&#xff09; 1 介绍及安装 1.1 介绍 分布式系统架构中对一致性要求很高&#xff0c;etcd就满足了分布式系统中的一致性要求。 实现了分布式一致性键值对存储的中间件&#xff0c;支持跨平台&#xff0c;有活跃的…

交互式标注工具-Paddlelabel

PaddleLabel 是基于飞桨 PaddlePaddle 各个套件功能提供的配套标注工具。目前支持对分类、检测、分割、OCR 四种常见的计算机视觉任务数据集进行标注和管理&#xff0c;除基础的手动标注功能外也支持深度学习辅助标注&#xff0c;可以有效地提升标注效率。重点是free free free…

玩转代码|那些实用的JavaScript单行代码,帮你轻松工作

目录 数组去重 从url获取参数并转为对象 检查对象是否为空 反转字符串 生成随机十六进制 检查当前选项卡是否在后台 检测元素是否处于焦点 检查设备类型 文字复制到剪贴板 获取选定的文本 查询某天是否为工作日 转换华氏/摄氏 两日期之间相差的天数 将 RGB 转换为…

并发-编程之JMMvolatile详解

并发三大特性&#xff1a;可见性、原子性、有序性 并发都是数据【多线程对一个变量进行连续加1】 线程A和B都对count进行连续加1&#xff0c;因为count不是原子性&#xff0c;如果再执行countcount1之前cpu执行权被抢占&#xff0c;就会阻塞住&#xff0c;这时候线程B完成count…

基于Java车库智能管理平台设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

Java | 使用切面AOP拦截并修改Controller接口请求参数

关注common wx&#xff1a; CodingTechWork 引言 在开发过程中&#xff0c;会有一些需求将controller层的一些方法入参进行全量转换&#xff0c;最容易想到的可能是在调用下层service方法时&#xff0c;调用公共的方法进行入参转换&#xff0c;这时带来的唯一问题就是代码不雅…

TCP的粘包、拆包、解决方案以及Go语言实现

什么是粘包&#xff0c;拆包&#xff1f; TCP的粘包和拆包问题往往出现在基于TCP协议的通讯中&#xff0c;比如RPC框架在使用TCP进行数据传输时&#xff0c;由于TCP是基于字节流的协议&#xff0c;而不是基于消息的协议&#xff0c;可能会出现粘包&#xff08;多个消息粘在一起…

基于matlab创建基于颜色特征的图像检索系统(附源码)

一、前言 此示例说明如何使用自定义的功能包工作流创建基于内容的图像检索 &#xff08;CBIR&#xff09; 系统。 基于内容的图像检索 &#xff08;CBIR&#xff09; 系统用于查找在视觉上与查询图像相似的图像。CBIR系统的应用可以在许多领域找到&#xff0c;例如基于网络的…

记账APP:小哈记账4——记账首页页面的制作(1)

项目介绍&#xff1a; 小哈记账是一款用于记账APP&#xff0c;基于Android Studio开发工具&#xff0c;采用Java语言进行开发&#xff0c;同时使用litepal和阿里云数据库进行数据的增删查改&#xff0c;以图标的形式在App的界面上显示。App可以清晰显示收支情况&#xff0c;并以…

2. MongoDB分片集群架构实战-----MongoDB分片集群和多文档事务详解

分布式技术MongoDB 1. 分片简介2. MongoDB分片集群架构3. 环境搭建3.1 分片集群搭建3.2 使用mtools搭建分片集群 4 使用分片集群5. 分片策略5.1 什么是chunk5.2 分片算法5.3 哈希分片5.4 分片标签5.4 分片键(ShardKey)的选择5.5 分片键(ShardKey)的约束 6. 数据均衡6.1 均衡的方…

【JAVAWEB】JavaScript基础知识

目录 1.认识JavaScript 1.1JavaScript是什么 1.2JavaScript和html,css的关系 1.3JavaScript的组成 2.JavaScript的前置知识 2.1JavaScript的书写形式 行内式 内嵌式 外部式 2.2注释 2.3输入输出 3.JavaScript的语法知识 3.1变量的使用 创建变量 使用变量 3.2动态…

echarts柱状图查找数据

controller层&#xff1a; /*** 查询最近一周每天的行为识别总人数* return*/ApiOperation("查询最近一周每天的行为识别总人数") // RequiresPermissions("zhgd:aialarmdata:selectShu")GetMapping("/selectShu")public List<List> se…

UE5 Motion Warping功能学习

MotionWarping&#xff08;运动扭曲&#xff09;可对角色根运动进行修改&#xff0c;从而让角色根运动动画结束时准确停在某一点&#xff0c;如图&#xff1a; 此外UE5还提供移动步幅、转向的Warping功能&#xff08;防滑步&#xff09;&#xff0c;之前写过一个简单的介绍可…

9.2 IO多路复用select函数

目录 I/O多路复用模型 多路复用的实现方式 select函数 fd_set结构体 I/O多路复用模型 多路复用的实现方式 select函数 int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);poll函数 int poll(struct pollfd *fds, nfds_…

Git 安装 配置初始化

1. Git 下载 1.1 git 官网下载 Git 官网 https://git-scm.com/download/win 根据自己的电脑系统下载对应的版本 1.2 百度网盘下载 百度网盘&#xff1a;https://pan.baidu.com/s/17Thcov7VKfIc_hINcQimrw 提取码&#xff1a;13142. 安装git 2.1 双击安装包 2.2 点击next …

新应用爆发,开启5G的鱼龙之变

鱼龙变化&#xff0c;是中国自古以来就有的吉祥寓意与美好期盼。早在商代出土的玉雕中&#xff0c;就出现了由鱼化为龙的形象。晋代民间的歌谣中&#xff0c;已经有了“东海大鱼化为龙”的说法。在此之后&#xff0c;“鱼跃龙门”成为了考试中第的代名词&#xff0c;也被引申为…

台灯选用什么类型好?分享好用的护眼台灯

建议是选择护眼台灯比较好一点&#xff0c;不管是大人还是孩子使用&#xff0c;都会比普通台灯护眼一些。主要是普通台灯在交流电状态下正常工作的时候&#xff0c;每秒钟会发生闪烁100次左右&#xff0c;这样的频率人眼是看不出来的。但是在台灯下时间一长&#xff0c;极其容易…

sonarqube安装指南

sonarQube安装的指导文章说起来有很多&#xff0c;其他步骤本文不再赘述&#xff0c;可以参考其他文章。 在这里讲一下对JDK版本的事情。 SonarQube Server对系统的JDK、和研发写代码所使用的JDK版本有要求&#xff0c;要求大版本统一&#xff0c;比如大家基本上都在用JDK8&a…