【Shell编程 / 4】函数定义、脚本执行与输入输出操作
文章目录
- 函数 与 脚本
- 定义函数
- 示例:简单的 Shell 函数
- 函数参数
- 返回值
- 脚本执行
- 创建脚本
- 执行脚本
- 输入输出
- 输出:`echo 和 printf
- 输入:read 命令
- 命令行参数
- 示例:传递参数
函数 与 脚本
在 Shell 编程中,函数和脚本是组织代码、提高复用性、简化调试的重要工具。下面我们将学习 如何在 Shell 中定义函数、执行脚本、获取输入与输出,以及如何处理命令行参数。
定义函数
Shell 允许 在脚本中定义函数,以便将常用的功能模块化,从而使得代码更加简洁易懂。函数的基本语法如下:
function_name() {# 函数体# 执行操作
}
我们也可以使用 function 关键字来定义函数:
function function_name {# 函数体# 执行操作
}
示例:简单的 Shell 函数
# 定义一个简单的函数,输出传入的参数
greet() {echo "Hello, $1!"
}# 调用函数
greet "Alice" # 输出: Hello, Alice!
函数参数
Shell 函数可以接收传入的参数,参数在函数内部通过 $1、$2 等变量进行访问,其中 $1 表示第一个参数,$2 表示第二个参数,依此类推。也可以使用 $@ 来表示所有传入的参数。
# 函数接收多个参数
sum() {result=$(( $1 + $2 ))echo "The sum is: $result"
}# 调用函数并传递参数
sum 3 5 # 输出: The sum is: 8
返回值
Shell 函数没有明确的返回值,但可以通过 echo 或 printf 将结果输出,并通过 $? 来获取函数执行的返回状态码。$? 返回的是函数或命令执行后的退出状态,0 表示成功,非零表示失败。
# 返回状态码
is_even() { if [ $(( $1 % 2 )) -eq 0 ]; thenreturn 0 # 返回 0 表示偶数elsereturn 1 # 返回 1 表示奇数fi
}is_even 4
echo $? # 输出: 0is_even 5
echo $? # 输出: 1
脚本执行
Shell 脚本是由一系列 Shell 命令组成的文本文件,可以包含函数、流程控制语句、输入输出等。执行 Shell 脚本需要具备一定的权限,并使用合适的命令来运行脚本。
创建脚本
一个简单的 Shell 脚本通常包含以下几个部分:
- Shebang(#!): 它告诉系统应该使用哪个解释器来执行脚本。例如,
#!/bin/bash表示使用bash解释器执行脚本。 - 命令和控制结构: 包含希望脚本执行的具体操作,如文件操作、条件判断、循环等。
#!/bin/bash# 输出当前日期和时间
echo "Today's date is $(date)"# 执行其他命令
执行脚本
- 赋予执行权限:在执行脚本之前,首先需要确保脚本具有可执行权限。(通过
chmod命令)。
chmod +x script.sh
- 执行脚本:可以直接使用
./来执行脚本。./表示当前目录,因此./script.sh表示执行当前目录中的script.sh文件。
./script.sh
如果没有在文件夹中运行脚本,也可以直接通过解释器来执行脚本,例如:
bash script.sh
输入输出
Shell 脚本通过 echo 和 printf 输出信息,并且通过 read 命令接收用户输入。
输出:`echo 和 printf
echo:echo是最常用的输出命令,用于在终端打印文本。
echo "Hello, world!" # 输出: Hello, world!
printf:printf提供更强大的格式化功能,类似于 C 语言中的printf。
# 使用 printf 格式化输出
printf "Hello, %s!\n" "Alice" # 输出: Hello, Alice!
输入:read 命令
read 命令用于从用户获取输入并将其存储到变量中。可以提示用户输入信息,并根据输入值执行相应的操作。
echo "Enter your name:"
read name
echo "Hello, $name!"
也可以在一行内获取多个输入:
echo "Enter your age and city:"
read age city
echo "You are $age years old and live in $city."
命令行参数
Shell 脚本可以通过命令行参数接收外部输入。在脚本执行时,可以在命令行中传递多个参数,脚本会通过 $1、$2 等变量来访问这些参数。
$1、$2等表示传递给脚本的第一个、第二个参数,依此类推。$#表示传递给脚本的参数个数。$@表示所有传递给脚本的参数。
# 一个简单的脚本例子
#!/bin/bashecho "Script name: $0" # 输出脚本的名称
echo "First argument: $1"
echo "Second argument: $2"
echo "Total number of arguments: $#"
echo "All arguments: $@"
示例:传递参数
$ ./script.sh arg1 arg2
Script name: ./script.sh
First argument: arg1
Second argument: arg2
Total number of arguments: 2
All arguments: arg1 arg2
相关文章:
【Shell编程 / 4】函数定义、脚本执行与输入输出操作
文章目录 函数 与 脚本定义函数示例:简单的 Shell 函数函数参数返回值 脚本执行创建脚本执行脚本 输入输出输出:echo 和 printf输入:read 命令 命令行参数示例:传递参数 函数 与 脚本 在 Shell 编程中,函数和脚本是组…...
RK3588+麒麟国产系统+FPGA+AI在电力和轨道交通视觉与采集系统的应用
工业视觉识别系统厂家提供的功能主要包括: 这些厂家通过先进的视觉识别技术,实现图像的采集、处理与分析。系统能够自动化地完成质量检测、物料分拣、设备监控等任务,显著提升生产效率和产品质量。同时,系统具备高度的灵活性和可扩…...
MySQL 01 02 章——数据库概述与MySQL安装篇
一、数据库概述 (1)为什么要使用数据库 数据库可以实现持久化,什么是持久化:数据持久化意味着将内存中的数据保存到硬盘上加以“固化”持久化的主要作用是:将内存中的数据存储在关系型数据库中,当然也可以…...
运行framework7
安装 framework7 下载地址https://gitcode.com/gh_mirrors/fr/framework7-vue node 下载 https://nodejs.cn/#ionic 配置npm 的镜像源 npm config set registry https://registry.npmmirror.com 下载nvm 进行nvm管理https://www.downza.cn/soft/352547.html 我一开始使用node…...
【Web】软件系统安全赛CachedVisitor——记一次二开工具的经历
明天开始考试周,百无聊赖开了一把CTF,还顺带体验了下二开工具,让无聊的Z3很开心🙂 CachedVisitor这题 大概描述一下:从main.lua加载一段visit.script中被##LUA_START##(.-)##LUA_END##包裹的lua代码 main.lua loca…...
实现自定义集合类:深入理解C#中的IEnumerable<T>接口
文章目录 介绍主要成员示例代码约束常见的约束类型示例代码介绍 在C#中,IEnumerable<T> 是一个泛型接口,用于表示可以被枚举的集合。它定义了用于遍历集合中元素的方法和属性。IEnumerable<T> 是 IEnumerable 的泛型版本,提供了类型安全的枚举功能。 当我们实…...
Compression Techniques for LLMs
Compression Techniques for LLMs 随着大型语言模型(LLMs)的迅速发展,提高其计算效率和存储效率成为研究的重要方向。为了实现这一目标,诸多压缩技术应运而生。本文将深入探讨几种有效的压缩技术,这些技术不仅能够降低…...
Nexus Message Transaction Services(MTS)
Nexus 系列交换机遇到以下情形时,可以尝试查看是否是 MTS 消息卡在缓冲区过多,因为 MTS 负责处理模块内以及跨模块(包括跨管理引擎)的各服务之间的消息路由和排队。 • CPU 高 • 命令行无响应、响应慢 • 控制平面中断 • 流量问…...
2025年Stable Diffusion安装教程(超详细)
StableDiffusion的安装部署其实并不困难,只需简单点击几下,几分钟就能安装好,不管是windows还是苹果mac电脑,关于StableDiffusion的各种安装方式,这片文章一一来给大家讲明白。(所有安装资料都给大家整理好…...
力扣【SQL连续问题】
180. 连续出现的数字 SELECT DISTINCT if(a.num b.num AND b.num c.num,a.num,null) AS ConsecutiveNums FROM Logs a LEFT OUTER JOIN Logs b ON a.id1 b.id LEFT OUTER JOIN Logs c ON a.id2 c.id WHERE if(a.num b.num AND b.num c.num,a.num,null) IS NOT NULL603. 连…...
深圳市-地铁线路和站点名称shp矢量数据(精品)2021年-2030最新arcmap含规划路线内容测评分析
深圳市的地铁网络是城市公共交通系统的重要组成部分,随着城市的发展,其规模和覆盖范围也在不断扩大。这份"深圳市-地铁线路和站点名称shp矢量数据(精品)2021年-2030最新arcmap含规划路线.zip"压缩包提供了全面而详细的信…...
企业级网络运维管理系统深度解析与实践案例
企业级网络运维管理系统深度解析与实践案例 在当今这个信息化时代,企业网络系统的稳定运行和高效管理成为了业务持续发展和创新的关键。企业级网络运维管理系统作为支撑这一目标的基石,其重要性不言而喻。本文将深入探讨企业级网络运维管理系统的构建原则、关键组件、实施步…...
音视频入门基础:MPEG2-PS专题(5)——FFmpeg源码中,解析PS流中的PES流的实现
一、引言 从《音视频入门基础:MPEG2-PS专题(3)——MPEG2-PS格式简介》中可以知道,PS流由一个个pack(包装)组成。一个pack 一个pack_header 一个或多个PES_packet。pack_header中还可能存在system header…...
【问题记录】npm create vue@latest报错
1,错误日志 npm error code EPERM npm error syscall mkdir npm error path D:\Program Files\nodejs\node_cache\_cacache npm error errno EPERM npm error FetchError: Invalid response body while trying to fetch https://registry.npmjs.org/create-vue: EP…...
OpenGL材质系统和贴图纹理
上一篇文章当中笔者为大家介绍了风氏光照模型,相信大家也发现了光照着色器当中有设置有很多控制光照强度的参数,而所谓的材质系统就是我们可以人为的去调节这些参数,让一个物体的反光效果能够更加接近我们现实生活当中的一些物体。 材质系统…...
Markdown中类图的用法
Markdown中类图的用法 前言语法详解基本流程图几何图形节点默认的节点分离节点的ID与内容节点形状圆角形节点的语法圆形节点的语法。非对称节点语法菱形节点的语法。六角形节点的语法。平行四边形节点的语法。梯形节点的语法。 连接线基本的连接线语法。无向线段连接线。点状连…...
钓鱼攻击(Phishing)详解和实现 (网络安全)
钓鱼攻击(Phishing)详解和实现 钓鱼攻击是一种社会工程学攻击,攻击者通过伪装成可信任的实体诱使受害者泄露敏感信息,如用户名、密码、信用卡号等。以下详细介绍钓鱼攻击的原理、种类、实现方式,以及防御措施。 一、钓…...
window11 wsl mysql8 错误分析:1698 - Access denied for user ‘root‘@‘kong.mshome.net‘
🚨 错误分析:1698 - Access denied for user rootkong.mshome.net 这个错误是因为 MySQL 的 root 用户 使用 auth_socket 插件进行身份验证,而不是使用密码。因此,当你尝试从 远程主机 连接时,MySQL 会拒绝访问。 ✅ …...
C++线程同步之条件变量
C线程同步之条件变量 文章目录 C线程同步之条件变量什么是条件变量(Condition Variable)?条件变量的主要用途常见的应用场景C11中的条件变量condition_variable的使用方法std::condition_variable的使用步骤典型的使用示例:生产者…...
如何实现多条件搜索
我们先来看多条件查询的样式是什么样的! 给查询按钮添加点击事件,然后获取到对应输入框中的值 然后通过filter过滤,对获取到的数据进行筛选 ,然后调用渲染函数将过滤搜索到的数据在页面中显示出来。 这就是进行多条件搜索出来的效…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
手机平板能效生态设计指令EU 2023/1670标准解读
手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...
【WebSocket】SpringBoot项目中使用WebSocket
1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖,添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...
2.3 物理层设备
在这个视频中,我们要学习工作在物理层的两种网络设备,分别是中继器和集线器。首先来看中继器。在计算机网络中两个节点之间,需要通过物理传输媒体或者说物理传输介质进行连接。像同轴电缆、双绞线就是典型的传输介质,假设A节点要给…...
