【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过滤,对获取到的数据进行筛选 ,然后调用渲染函数将过滤搜索到的数据在页面中显示出来。 这就是进行多条件搜索出来的效…...
华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...
数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !
我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...
API网关Kong的鉴权与限流:高并发场景下的核心实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中,API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关,Kong凭借其插件化架构…...
在golang中如何将已安装的依赖降级处理,比如:将 go-ansible/v2@v2.2.0 更换为 go-ansible/@v1.1.7
在 Go 项目中降级 go-ansible 从 v2.2.0 到 v1.1.7 具体步骤: 第一步: 修改 go.mod 文件 // 原 v2 版本声明 require github.com/apenella/go-ansible/v2 v2.2.0 替换为: // 改为 v…...
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅!
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅! 🌱 前言:一棵树的浪漫,从数组开始说起 程序员的世界里,数组是最常见的基本结构之一,几乎每种语言、每种算法都少不了它。可你有没有想过,一组看似“线性排列”的有序数组,竟然可以**“长”成一棵平衡的二…...
【iOS】 Block再学习
iOS Block再学习 文章目录 iOS Block再学习前言Block的三种类型__ NSGlobalBlock____ NSMallocBlock____ NSStackBlock__小结 Block底层分析Block的结构捕获自由变量捕获全局(静态)变量捕获静态变量__block修饰符forwarding指针 Block的copy时机block作为函数返回值将block赋给…...
