当前位置: 首页 > news >正文

Linux 高级 Shell 脚本编程:掌握 Shell 脚本精髓,提升工作效率

【Linux】 高级 Shell 脚本编程:掌握 Shell 脚本精髓,提升工作效率

Shell 脚本编程是 Linux 系统管理员和开发人员的必备技能。通过学习高级 Shell 脚本编程,你可以编写更高效、更灵活和更易于维护的脚本。本文将介绍 Shell 脚本编程中的函数、数组、高级控制结构和脚本调试技巧,并提供一些实用的示例,帮助你提升 Shell 脚本编程技能。

1. 函数

函数是 Shell 脚本编程中的基本构建块。通过将代码组织成函数,你可以提高代码的可读性和可维护性,并避免代码重复。

1.1 定义函数

你可以使用以下语法定义函数:

function_name() {# 函数体
}

1.2 调用函数

你可以使用以下语法调用函数:

function_name

1.3 示例

以下是一个示例,演示如何定义和调用一个简单的函数:

#!/bin/bash# 定义函数
greet() {echo "Hello, World!"
}# 调用函数
greet

1.4 使用函数参数

函数可以接受参数,就像脚本一样。你可以使用特殊变量 $1$2 等访问这些参数。

#!/bin/bash# 定义函数,接受一个参数
say_hello() {echo "Hello, $1!"
}# 调用函数,传递参数
say_hello "Alice"
say_hello "Bob"

1.5 使用函数返回值

函数可以返回一个值,你可以使用 return 命令来实现。

#!/bin/bash# 定义函数,计算两个数的和
add() {local sum=$(( $1 + $2 ))return $sum
}# 调用函数,保存返回值
add 3 5
local result=$?
echo "The sum is $result"

2. 数组

数组是 Shell 脚本编程中的数据结构,用于存储一组有序的元素。通过使用数组,你可以更方便地处理数据集合。

2.1 定义数组

你可以使用以下语法定义数组:

array_name=("element1" "element2" "element3")

2.2 访问数组元素

你可以使用以下语法访问数组元素:

${array_name[index]}

2.3 遍历数组

你可以使用以下语法遍历数组:

for element in "${array_name[@]}"; do# 处理数组元素
done

2.4 示例

以下是一个示例,演示如何定义、访问和遍历数组:

#!/bin/bash# 定义数组
fruits=("apple" "banana" "cherry")# 访问数组元素
echo "First fruit: ${fruits[0]}"# 遍历数组
for fruit in "${fruits[@]}"; doecho "I like $fruit"
done

2.5 使用数组索引

你可以使用数组索引来访问数组元素。数组索引从 0 开始。

#!/bin/bash# 定义数组
numbers=(1 2 3 4 5)# 访问数组元素
echo "Third number: ${numbers[2]}"

2.6 使用数组长度

你可以使用 #${array_name[@]}${#array_name[*]} 来获取数组的长度。

#!/bin/bash# 定义数组
colors=("red" "blue" "green")# 获取数组长度
local length=${#colors[@]}
echo "The array has $length elements."

3. 高级控制结构

除了基本的 ifforwhile 循环,Shell 脚本编程还提供了一些高级控制结构,如 case 语句和 select 循环。

3.1 case 语句

case 语句允许你根据模式匹配值,并执行相应的代码块。

case "$variable" inpattern1)# 代码块 1;;pattern2)# 代码块 2;;*)# 默认代码块;;
esac

3.2 select 循环

select 循环允许用户从列表中选择一个选项,并执行相应的代码块。

select option in "option1" "option2" "option3"; do# 处理用户选择的选项
done

3.3 示例

以下是一个示例,演示如何使用 case 语句和 select 循环:

#!/bin/bash# case 语句
fruit="banana"
case "$fruit" in"apple")echo "I like apples.";;"banana")echo "I like bananas.";;*)echo "I don't know this fruit.";;
esac# select 循环
PS3="Choose a fruit: "
select fruit in "apple" "banana" "cherry"; doecho "You selected $fruit."
done

4. 脚本调试技巧

调试是 Shell 脚本编程中的关键步骤。以下是一些常用的脚本调试技巧:

4.1 使用 set 命令

set 命令允许你设置 Shell 选项,例如启用或禁用调试模式。

set -x  # 启用调试模式
set +x  # 禁用调试模式

4.2 使用 trap 命令

trap 命令允许你在脚本退出时执行清理代码。

trap "echo Goodbye!" EXIT

4.3 使用 echo 命令

echo 命令允许你输出变量和表达式的值,以便进行调试。

echo "Variable value: $variable"

4.4 使用管道和重定向

你可以使用管道和重定向将脚本输出保存到文件中,以便进行调试。

script.sh > output.txt  # 将脚本输出保存到文件

5. 总结

高级 Shell 脚本编程是提升 Shell 脚本编程技能的关键。通过学习函数、数组、高级控制结构和脚本调试技巧,你可以编写更高效、更灵活和更易于维护的脚本。掌握这些技能可以帮助你更好地利用 Shell 脚本解决实际问题,提高工作效率。

相关文章:

Linux 高级 Shell 脚本编程:掌握 Shell 脚本精髓,提升工作效率

【Linux】 高级 Shell 脚本编程:掌握 Shell 脚本精髓,提升工作效率 Shell 脚本编程是 Linux 系统管理员和开发人员的必备技能。通过学习高级 Shell 脚本编程,你可以编写更高效、更灵活和更易于维护的脚本。本文将介绍 Shell 脚本编程中的函数…...

【ARMv8/v9 GIC 系列 1.5 -- Enabling the distribution of interrupts】

请阅读【ARM GICv3/v4 实战学习 】 文章目录 Enabling the distribution of interruptsGIC Distributor 中断组分发控制CPU Interface 中断组分发控制Physical LPIs 的启用Summary Enabling the distribution of interrupts 在ARM GICv3和GICv4体系结构中,中断分发…...

《mysql篇》--索引事务

索引 索引的介绍 索引是帮助MySQL高效获取数据的数据结构,是一种特殊的文件,包含着对数据表里所有记录的引用指针,因为索引本身也比较大,所以索引一般是存储在磁盘上的,索引的种类有很多,不过如果没有特殊…...

科研绘图系列:R语言STAMP图(STAMP Plot)

介绍 STAMP图(STAMP plot)并非一个广泛认知的、具有特定名称的图表类型,而是可能指在STAMP(Statistical Analysis of Metagenomic Profiles:“STAMP: statistical analysis of taxonomic and functional profiles”)软件使用过程中生成的各种统计和可视化图表的总称。ST…...

运维团队如何应对动环监控与IT监控分离的挑战

IT与机房动环监控的一体化是当下及未来的必然趋势,这一模式显著节省了运维过程中的时间与成本。一体化平台不仅消除了频繁切换系统的繁琐,更在一个统一界面上实现了多元化的管理运维功能,极大地提升了工作效率。 在机房升级或新建项目中&…...

深入解析大数据核心概念:数据平台、数据中台、数据湖与数据仓库的异同与应用

大数据领域内的诸多概念常常让人困惑,其中数据平台、数据中台、数据湖和数据仓库是最为关键的几个。 1. 数据平台 定义: 数据平台是一个综合性的技术框架,旨在支持整个数据生命周期的管理和使用。它包含数据采集、存储、处理、分析和可视化…...

开发指南040-业务操作日志

平台所有业务操作都存储在核心库&#xff0c;以便统一分析处理。各业务微服务通过feign调用核心日志服务。底层提供了API&#xff1a; <dependency><groupId>org.qlm</groupId><artifactId>qlm-api</artifactId><version>1.0-SNAPSHOT<…...

如何构建数据驱动的企业?爬虫管理平台是关键桥梁吗?

一、数据驱动时代&#xff1a;为何选择爬虫管理平台&#xff1f; 在信息爆炸的今天&#xff0c;数据驱动已成为企业发展的核心战略之一。爬虫管理平台&#xff0c;作为数据采集的第一站&#xff0c;它的重要性不言而喻。这类平台通过自动化手段&#xff0c;从互联网的各个角落…...

多线程Thread

线程Thread简介 任务、线程、金城、多线程 多任务&#xff1a;短时间切换不同得任务 多线程&#xff1a;通过同一条道路&#xff0c;增加道多条道路&#xff0c;提高使用率&#xff0c;解决堵塞问题 普通方法调多线程只有主线一台执行路径是主线程调run()方法&#xff0c;方…...

计算机网络之WPAN 和 WLAN

上一篇文章内容&#xff1a;无线局域网 1.WPAN&#xff08;无线个人区域网&#xff09; WPAN 是以个人为中心来使用的无线个人区域网&#xff0c;它实际上就是一个低功率、小范围、低速率和低价格的电缆替代技术。 &#xff08;1&#xff09; 蓝牙系统(Bluetooth) &#…...

TikTok海外运营,云手机多种变现方法

从现阶段来看&#xff0c;TikTok 的用户基数不断增长&#xff0c;已然成为全球创业者和品牌的全新竞争舞台。其用户数量近乎 20 亿&#xff0c;年轻用户占据主导&#xff0c;市场渗透率也逐年提高。不管是大型企业、著名品牌&#xff0c;还是个体创业者&#xff0c;都绝不能小觑…...

kubekey在ubuntu24实现kubernetes快速安装

基于Ubunut24.04安装 设置主机名 hostnamectl set-hostname kkmain hostnamectl set-hostname kknode1 hostnamectl set-hostname kknode2关闭swap sudo swapoff -a sudo sed -i s/.*swap.*/#&/ /etc/fstab安装kubekey export KKZONEcn curl -sfL https://get-kk.kubes…...

根据关键词query获取google_img(api方式)

文章目录 说明代码第一部分&#xff1a;链接保存为Json第二部分&#xff1a;链接转换为img 说明 根据关键词query获取google_img USERNAME “xxx” PASSWORD “xxx” 官网申请。 代码 首先获取图片链接&#xff0c;保存为json之后下载。 第一部分&#xff1a;链接保存为…...

西安明德理工学院师生莅临泰迪智能科技开展参观见习活动

为进一步深化校企合作&#xff0c;落实高校应用型人才培养。7月8日&#xff0c;西安明德理工学院与广东泰迪智能科技股份有限公司联合开展学生企业见习活动。西安明德理工学院金融产业学院副院长刘敏、金融学专业负责人张莉萍、金融学专业教师曹艳飞、赵浚妤、泰迪智能科技董事…...

通用机器人里程碑!MIT提出策略组合框架PoCo,解决数据源异构难题,实现机器人多任务灵活执行

18 位人形机器人充当「迎宾」人员&#xff0c;整齐划一向嘉宾挥手&#xff0c;这是 2024 世界人工智能大会上的一个震撼场景&#xff0c;让人们直观感受到了今年机器人的飞速发展。 图源&#xff1a;甲子光年 1954 年&#xff0c;世界上第一台可编程机器人「尤尼梅特」在通用汽…...

基于Java中的SSM框架实现疫情冷链追溯系统项目【项目源码+论文说明】

基于Java中的SSM框架实现疫情冷链追溯系统演示 摘要 近几年随着城镇化发展和居民消费水平的不断提升&#xff0c;人们对健康生活方式的追求意识逐渐加强&#xff0c;生鲜食品逐渐受到大众青睐&#xff0c;诸如盒马鲜生、7-fresh等品牌生鲜超市&#xff0c;一时间如雨后春笋般迅…...

想在vue中预览doxc,excel,pdf文件? vue-office提供包支持

在浩瀚的Vue生态中&#xff0c;vue-office犹如一颗璀璨的星辰&#xff0c;以其独特的魅力照亮了开发者处理多种文件格式的预览之路。这款精心打造的Vue组件库&#xff0c;不仅拥抱了Vue2的经典&#xff0c;也紧密跟随Vue3的步伐&#xff0c;展现了卓越的技术前瞻性和兼容性。它…...

PostgreSQL16安装Mac(brew)

问题 最近需要从MySQL切换到PostgreSQL。我得在本地准备一个PostgreSQL。 步骤 使用brew安装postgresql16: arch -arm64 brew install postgresql16启动postgresql16: brew services start postgresql16配置postgresql环境变量&#xff0c;打开环境变量文件&#xff1a; …...

【语音识别算法】深度学习语音识别算法与传统语音识别算法的区别、对比及联系

深度学习语音识别算法与传统语音识别算法在理论基础、实现方式、性能表现等方面存在显著区别&#xff0c;同时也有一些联系。下面将从几个方面详细比较这两种方法&#xff0c;并给出应用实例和代码示例。 一、理论基础与实现方式 1.传统语音识别算法&#xff1a; 特征提取&a…...

图片批量重命名bat,一个脚本快速搞定图片批量重命名

BAT 批处理 是一种在 Microsoft Windows 操作系统中使用的脚本语言&#xff0c;用于自动执行一系列预定义的命令或任务。这些命令集合通常存储在一个文本文件中&#xff0c;文件扩展名为 .bat 或 .cmd。批处理脚本可以包含简单的命令&#xff0c;如文件复制、移动、删除&#x…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

iview框架主题色的应用

1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题&#xff0c;无需引入&#xff0c;直接可…...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...

android13 app的触摸问题定位分析流程

一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...

Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成

一个面向 Java 开发者的 Sring-Ai 示例工程项目&#xff0c;该项目是一个 Spring AI 快速入门的样例工程项目&#xff0c;旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计&#xff0c;每个模块都专注于特定的功能领域&#xff0c;便于学习和…...