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

《Linux Shell 脚本深度探索:原理与高效编程》

1. 基本结构
Shebang 行
#!/bin/bash # Shebang 行指定了脚本使用的解释器。
/bin/bash 表示使用 Bash 解释器执行脚本。
注释

# 这是注释,不会被执行

2. 变量
定义变量
variable_name=value # 不需要加 $ 来定义变量。 
# 变量名不能包含空格或特殊字符。
访问变量
echo $variable_name 
# 使用 $ 符号来访问变量的值。
环境变量
echo $PATH echo $HOME 
# 环境变量是全局可用的,如 PATH 和 HOME。
局部变量
local var=local_value 
# 在函数中使用 local 关键字定义局部变量。
变量赋值和引用
greeting="Hello" 
name="World" 
echo "$greeting, $name!" 
# 使用双引号引用变量,保留变量中的空格和特殊字符。
3. 输入输出
标准输入输出
read -p "Enter your name: " name 
# read 命令用于从标准输入读取用户输入。 
# -p 选项用于显示提示信息。 
echo "Hello, $name!" # echo 命令用于输出信息到标准输出。

文件重定向
echo "Hello World" > file.txt # > 
将输出重定向到文件,如果文件存在则覆盖。 
echo "Another line" >> file.txt # >> 
将输出追加到文件末尾。 cat < file.txt 
# < 将文件内容作为输入。

管道符
ls | grep ".txt" 
# | 将一个命令的输出作为另一个命令的输入。
4. 控制结构
if 语句
if [ condition ]; then # do something elif [ another_condition ]; 
then # do something else else 
# default action fi # 使用 [ ] 或 [[ ]] 来进行条件判断。 
# 支持逻辑运算符:-eq(等于)、-ne(不等于)、-gt(大于)、-lt(小于)、-ge(大于等于)、-le(小于等于)。
示例
number=10 if [ $number -gt 5 ]; 
then echo "Number is greater than 5" elif [ $number -eq 5 ]; 
then echo "Number is equal to 5" else echo "Number is less than 5" fi
for 循环
for i in 1 2 3 4 5; do echo $i done 
# for 循环遍历一系列值。
示例
for fruit in apple banana cherry; 
do echo "Fruit: $fruit" done
C风格的for循环
for ((i=0; i<5; i++)); do echo $i done 
# C风格的 for 循环,类似于 C 语言中的 for 循环。
示例
for ((i=0; i<5; i++)); 
do echo "Iteration: $i" done
while 循环
while [ condition ]; 
do # do something done 
# while 循环在条件为真时重复执行。
示例
count=0 while [ $count -lt 5 ]; 
do echo "Count: $count" count=$((count + 1)) done
until 循环
until [ condition ]; 
do # do something done 
# until 循环在条件为假时重复执行。
示例
count=0 until [ $count -ge 5 ]; 
do echo "Count: $count" count=$((count + 1)) done
case 语句
case $var in value1) 
# do something ;; value2) # do something else ;; *) 
# default case ;; esac # case 语句用于多分支条件判断。 
# ;; 表示结束一个 case 分支。 
# * 表示默认分支,当没有匹配到任何 case 时执行。
示例
day="Monday" case $day in Monday) 
echo "Today is Monday" ;; Tuesday) 
echo "Today is Tuesday" ;; *) 
echo "It's some other day" ;; esac
5. 函数
定义函数
function_name() { # function body } 
# 使用 function_name() 定义函数。
示例
greet() { echo "Hello, World!" } greet
带参数的函数
function_name() { local arg1=$1 local arg2=$2 echo "Argument 1: $arg1" echo "Argument 2: $arg2" } function_name "first" "second" 
# 通过 $1, $2 等访问函数参数。 
# 使用 local 关键字定义局部变量。
示例
add() { local num1=$1 local 
num2=$2 local sum=$((num1 + num2)) 
echo "Sum: $sum" } add 5 10
返回值
function_name() 
{ echo "return value" } 
result=$(function_name) 
echo $result 
# 使用 echo 输出返回值,并通过命令替换捕获返回值。
示例
get_greeting() 
{ echo "Hello, User!" } 
greeting=$(get_greeting) 
echo $greeting
6. 数组
定义数组
array=(value1 value2 value3) 
# 使用 () 定义数组。
示例
fruits=("apple" "banana" "cherry")
访问数组元素
echo ${array[0]} 
# 使用 ${array[index]} 访问数组元素。
示例
echo ${fruits[1]} 
# 输出 "banana"
遍历数组
for element in "${array[@]}"; 
do echo $element done 
# 使用 "${array[@]}" 遍历数组中的所有元素。
示例
for fruit in "${fruits[@]}"; 
do echo "Fruit: $fruit" done
获取数组长度
echo ${#array[@]}
# 使用 ${#array[@]} 获取数组的长度。
示例
echo "Number of fruits: ${#fruits[@]}"
添加元素到数组
array+=("new_value") 
# 使用 += 添加元素到数组末尾。
示例
fruits+=("orange") 
echo "Updated fruits: ${fruits[@]}"
7. 字符串操作
字符串长度
str="hello" echo ${#str} 
# 使用 ${#str} 获取字符串的长度。
示例
greeting="Hello, World!" 
echo "Length of greeting: ${#greeting}"
字符串截取
str="hello world" echo ${str:0:5} 
# 输出 "hello" 
# 使用 ${str:start:length} 截取字符串的一部分。
示例
substring=${greeting:0:5} 
echo "Substring: $substring"
字符串替换
str="hello world" 
echo ${str//world/universe} 
# 输出 "hello universe" 
# 使用 ${str//old/new} 替换字符串中的所有匹配项。
示例
new_greeting=${greeting/world/universe} 
echo "New greeting: $new_greeting"
字符串拼接
str1="hello" str2="world" 
echo "$str1 $str2" 
# 使用空格或变量拼接字符串。
示例
full_greeting="$greeting, welcome!" 
echo "Full greeting: $full_greeting"
8. 文件和目录操作
检查文件是否存在
if [ -f "file.txt" ]; then echo "File exists" fi 
# 使用 [ -f "file.txt" ] 检查文件是否存在。
示例
if [ -f "example.txt" ]; then echo "example.txt exists" 
else echo "example.txt does not exist" fi
创建目录
mkdir directory_name 
# 使用 mkdir 创建目录。
示例
mkdir new_folder 
echo "Directory created: new_folder"
删除文件或目录
rm file.txt 
# 使用 rm 删除文件。 
rm -r directory_name 
# 使用 rm -r 删除目录及其内容。
示例
rm old_file.txt 
echo "File removed: old_file.txt" 
rm -r old_folder 
echo "Directory removed: old_folder"
复制文件
cp source_file destination_file 
# 使用 cp 复制文件。
示例
cp original.txt copy.txt 
echo "File copied: original.txt to copy.txt"
移动文件
mv source_file destination_file 
# 使用 mv 移动文件或重命名文件。
示例
mv old_name.txt new_name.txt 
echo "File renamed: old_name.txt to new_name.txt"
查找文件
find /path -name "file-name" 
# 使用 find 查找指定路径下的文件。
示例
find . -name "*.txt" echo "All .txt files in the current directory:"
统计行数
wc -l file.txt 
# 使用 wc -l 统计文件的行数。
示例
line_count=$(wc -l < example.txt) 
echo "Line count in example.txt: $line_count"
查看文件内容
cat file.txt 
# 使用 cat 查看文件内容。
示例
cat example.txt 
echo "Content of example.txt:"
显示前几行
head -n 5 file.txt 
# 使用 head -n 5 显示文件的前 5 行。
示例
head -n 5 example.txt echo "First 5 lines of example.txt:"
显示后几行
tail -n 5 file.txt 
# 使用 tail -n 5 显示文件的后 5 行。
示例
tail -n 5 example.txt echo "Last 5 lines of example.txt:"
搜索文件内容
grep "string" file.txt 
# 使用 grep 搜索文件中的字符串。
示例
grep "hello" example.txt 
echo "Lines containing 'hello' in example.txt:"
排序
sort file.txt 
# 使用 sort 对文件内容进行排序。
示例
sort example.txt 
cho "Sorted content of example.txt:"
去重
uniq file.txt 
# 使用 uniq 去除文件中的重复行。
示例
uniq example.txt 
echo "Unique lines in example.txt:"
9. 常用命令
查找文件
find /path -name "file-name" 
# 使用 find 查找指定路径下的文件。
示例
find /home/user -name "*.log" echo "All .log files in /home/user:"
统计行数
wc -l file.txt 
# 使用 wc -l 统计文件的行数。
示例
wc -l example.txt 
echo "Line count in example.txt:"
查看文件内容
cat file.txt 
# 使用 cat 查看文件内容。
示例
cat example.txt 
echo "Content of example.txt:"
显示前几行
head -n 5 file.txt 
# 使用 head -n 5 显示文件的前 5 行。
示例
head -n 5 example.txt 
echo "First 5 lines of example.txt:"
显示后几行
tail -n 5 file.txt 
# 使用 tail -n 5 显示文件的后 5 行。
示例
tail -n 5 example.txt 
echo "Last 5 lines of example.txt:"
搜索文件内容
grep "string" file.txt 
# 使用 grep 搜索文件中的字符串。
示例
grep "hello" example.txt 
echo "Lines containing 'hello' in example.txt:"
排序
sort file.txt 
# 使用 sort 对文件内容进行排序。
示例
sort example.txt 
echo "Sorted content of example.txt:"
去重
uniq file.txt 
# 使用 uniq 去除文件中的重复行。
示例
uniq example.txt 
echo "Unique lines in example.txt:"
10. 错误处理
捕获命令退出状态
command || echo "Command failed" 
# 如果 command 失败,则执行 echo "Command failed"。
示例
ls /nonexistent_directory || echo "Directory does not exist"
try-catch 类似结构
{ command } || { echo "Error occurred" } 
# 使用 {} 将命令块分组,并在失败时执行错误处理。
示例
{ ls /nonexistent_directory } || { echo "Error: Directory does not exist" }
使用 set -e
set -e # 脚本代码 
# set -e 使脚本在遇到错误时立即退出。
示例
set -e ls /nonexistent_directory echo "This line will not be executed if the previous command fails"
使用 set -u
set -u # 脚本代码 
# set -u 使脚本在使用未定义的变量时立即退出。
示例
set -u echo $undefined_variable echo "This line will not be executed if the previous command fails"
11. 调试
打印调试信息
set -x 
# 脚本代码 set +x # set -x 开启调试模式,显示每条命令及其参数。 
# set +x 关闭调试模式。
示例
set -x echo "Starting script" ls /home/user echo "Script completed" set +x
使用 -e 选项
set -e # 脚本代码 
# set -e 使脚本在遇到错误时立即退出。
示例
set -e ls /nonexistent_directory echo "This line will not be executed if the previous command fails"
12. 示例脚本
简单备份脚本
#!/bin/bash
# Shebang 行指定了脚本使用的解释器。# 定义源目录和备份目录
SOURCE_DIR="/path/to/source"
BACKUP_DIR="/path/to/backup"# 创建备份目录(如果不存在)
if [ ! -d "$BACKUP_DIR" ]; thenmkdir -p "$BACKUP_DIR"echo "Backup directory created: $BACKUP_DIR"
fi# 复制文件到备份目录
rsync -av --delete "$SOURCE_DIR/" "$BACKUP_DIR/"
echo "Files copied to backup directory: $BACKUP_DIR"echo "Backup completed successfully."
用户交互脚本
#!/bin/bash
# Shebang 行指定了脚本使用的解释器。# 提示用户输入
read -p "Enter your name: " name
read -p "Enter your age: " age# 输出用户信息
echo "Hello, $name! You are $age years old."# 判断年龄是否为成年人
if [ $age -ge 18 ]; thenecho "You are an adult."
elseecho "You are a minor."
fi
文件查找和统计
#!/bin/bash
# Shebang 行指定了脚本使用的解释器。# 查找当前目录下所有txt文件并统计行数
find . -name "*.txt" | xargs wc -l
echo "Line count of all .txt files in the current directory."

相关文章:

《Linux Shell 脚本深度探索:原理与高效编程》

1. 基本结构 Shebang 行 #!/bin/bash # Shebang 行指定了脚本使用的解释器。 /bin/bash 表示使用 Bash 解释器执行脚本。 注释 # 这是注释&#xff0c;不会被执行 2. 变量 定义变量 variable_namevalue # 不需要加 $ 来定义变量。 # 变量名不能包含空格或特殊字符。 访…...

深入剖析:基于红黑树实现自定义 map 和 set 容器

&#x1f31f; 快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。&#x1f31f; 在 C 标准模板库&#xff08;STL&#xff09;的大家庭里&#xff0c;map和set可是超级重要的关联容器成员呢&#x1f60e;&#x…...

在大数据项目中如何设计和优化数据模型

在大数据项目中&#xff0c;设计和优化数据模型是一个涉及多个步骤和维度的复杂过程。以下是我通常采取的方法&#xff1a; 一、数据模型设计 明确业务需求&#xff1a; 深入了解项目的业务场景和目标&#xff0c;明确数据模型需要解决的具体问题。与业务团队紧密合作&#xf…...

JavaScript querySelector()、querySelectorAll() CSS选择器解析(DOM元素选择)

文章目录 基于querySelector系列方法的CSS选择器深度解析一、方法概述二、基础选择器类型1. 类型选择器2. ID选择器3. 类选择器4. 属性选择器 三、组合选择器1. 后代组合器2. 子元素组合器3. 相邻兄弟组合器4. 通用兄弟组合器 四、伪类与伪元素1. 结构伪类2. 状态伪类3. 内容伪…...

Linux系统中处理子进程的终止问题

1. 理解子进程终止的机制 在Unix/Linux系统中&#xff0c;当子进程终止时&#xff0c;会向父进程发送一个SIGCHLD信号。父进程需要捕捉这个信号&#xff0c;并通过调用wait()或waitpid()等函数来回收子进程的资源。这一过程被称为“回收僵尸进程”。 如果父进程没有及时调用w…...

Docker 不再难懂:快速掌握容器命令与架构原理

1. Docker 是容器技术的一种 容器&#xff08;Container&#xff09;概述 容器&#xff08;Container&#xff09;是一种轻量级的虚拟化技术&#xff0c;它将应用程序及其所有依赖环境打包在一个独立的、可移植的运行时环境中。容器通过操作系统级的虚拟化提供隔离&#xff0…...

取消票证会把指定的票证从数据库中删除,同时也会把票证和航班 等相关表中的关联关系一起删除。但在删除之前,它会先检查当前用户是否拥有这张票

在做航班智能客服问答系统时会遇到取消票证的场景&#xff0c;这里涉及数据库的操作时会把指定的票证从数据库中删除&#xff0c;同时也会把票证和航班等相关表中的关联关系一起删除。但在删除之前&#xff0c;需要先检查当前用户是否拥有这张票&#xff0c;只有票主才有权限取…...

力扣-贪心-763 划分字母区间

思路 先统计字符串中每一个字母出现的最后下标&#xff0c;然后从end初始化为第一个字母出现的最后下标&#xff0c;在i<end时&#xff0c;不断更新end&#xff0c;因为一旦囊括新的字母就最起码要遍历到新字母出现的最后下标&#xff0c;在i>end时&#xff0c;说明遍历…...

【Redis 原理】网络模型

文章目录 用户空间 && 内核空间阻塞IO非阻塞IO信号驱动IO异步IOIO多路复用selectpollepoll Web服务流程Redis 网络模型Redis单线程网络模型的整个流程Redis多线程网络模型的整个流程 用户空间 && 内核空间 为了避免用户应用导致冲突甚至内核崩溃&#xff0c;用…...

cpp中的继承

一、继承概念 在cpp中&#xff0c;封装、继承、多态是面向对象的三大特性。这里的继承就是允许已经存在的类&#xff08;也就是基类&#xff09;的基础上创建新类&#xff08;派生类或者子类&#xff09;&#xff0c;从而实现代码的复用。 如上图所示&#xff0c;Person是基类&…...

DeepSeek全栈接入指南:从零到生产环境的深度实践

第一章:DeepSeek技术体系全景解析 1.1 认知DeepSeek技术生态 DeepSeek作为新一代人工智能技术平台,构建了覆盖算法开发、模型训练、服务部署的全链路技术栈。其核心能力体现在: 1.1.1 多模态智能引擎 自然语言处理:支持文本生成(NLG)、语义理解(NLU)、情感分析等计算…...

CSS 真的会阻塞文档解析吗?

在网页开发领域&#xff0c;一个常见的疑问是 CSS 是否会阻塞文档解析。理解这一问题对于优化网页性能、提升用户体验至关重要。要深入解答这个问题&#xff0c;需要从浏览器渲染网页的原理说起。 浏览器渲染网页的基本流程 浏览器在接收到 HTML 文档后&#xff0c;会依次进行…...

大模型的UI自动化:Cline 使用Playwright MCP Server完成测试

大模型的UI自动化:Cline 使用Playwright MCP Server完成测试 MCP MCP(Model Context Protocol),是一个开发的协议,标准化了应用程序如何为大模型提供上下文。MCP提供了一个标准的为LLM提供数据、工具的方式,使用MCP会更容易的构建Agent或者是基于LLM的复杂工作流。 最近…...

碰撞检测 | 图解凸多边形分离轴定理(附ROS C++可视化)

目录 0 专栏介绍1 凸多边形碰撞检测2 多边形判凸算法3 分离轴定理(SAT)4 算法仿真与可视化4.1 核心算法4.2 仿真实验 0 专栏介绍 &#x1f525;课设、毕设、创新竞赛必备&#xff01;&#x1f525;本专栏涉及更高阶的运动规划算法轨迹优化实战&#xff0c;包括&#xff1a;曲线…...

Python 基本数据类型

目录 1. 字符串&#xff08;String&#xff09; 2. 列表&#xff08;List&#xff09; 3. 字典&#xff08;Dictionary&#xff09; 4. 集合&#xff08;Set&#xff09; 5. 数字&#xff08;Number&#xff09; 6. 布尔值&#xff08;Boolean&#xff09; 1. 字符串&…...

突破“第一崇拜“:五维心理重构之路

一、视频介绍 在这个崇尚"第一"的时代&#xff0c;我们如何找到自己的独特价值&#xff1f;本视频将带您踏上五维心理重构之旅&#xff0c;从诗意人生的角度探讨如何突破"圣人之下皆蝼蚁"的局限。我们将穿越人生的不同阶段&#xff0c;从青春的意气风发到…...

KubeKey一键安装部署k8s集群和KubeSphere详细教程

目录 一、KubeKey简介 二、k8s集群KubeSphere安装 集群规划 硬件要求 Kubernetes支持版本 操作系统要求 SSH免密登录 配置集群时钟 所有节点安装依赖 安装docker DNS要求 存储要求 下载 KubeKey 验证KubeKey 配置集群文件 安装集群 验证命令 登录页面 一、Ku…...

UE5网络通信架构解析

文章目录 前言一、客户端-服务器架构&#xff08;C/S Model&#xff09;二、对等网络架构&#xff08;P2P&#xff0c;非原生支持&#xff09;三、混合架构&#xff08;自定义扩展&#xff09;四、UE5网络核心机制 前言 UE5的网络通信主要基于客户端-服务器&#xff08;C/S&am…...

实验3 知识表示与推理

实验3 知识表示与推理 一、实验目的 &#xff08;1&#xff09;掌握知识和知识表示的基本概念&#xff0c;理解其在AI中的深刻含义与意义&#xff1b; &#xff08;2&#xff09;熟悉AI中常用的知识表示方法的优缺点及其应用场景&#xff1b; &#xff08;3&#xff09;掌握产…...

基于Springboot银行信用卡额度管理系统【附源码】

基于Springboot银行信用卡额度管理系统 效果如下&#xff1a; 系统登陆页面 用户个人中心页面 新增信用卡申请页面 评估审核页面 管理员主页面 评估审核页面 操作日志管理页面 消费页面 研究背景 随着金融行业的快速发展和信息技术的不断进步&#xff0c;信用卡作为一种便捷…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时&#xff0c;没有加载所有类库。插件运行过程中用到某个类库&#xff0c;会从CAD的安装目录找&#xff0c;找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库&#xff0c;就用插件程序加载进…...

LangFlow技术架构分析

&#x1f527; LangFlow 的可视化技术栈 前端节点编辑器 底层框架&#xff1a;基于 &#xff08;一个现代化的 React 节点绘图库&#xff09; 功能&#xff1a; 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...

k8s从入门到放弃之HPA控制器

k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率&#xff08;或其他自定义指标&#xff09;来调整这些对象的规模&#xff0c;从而帮助应用程序在负…...

微服务通信安全:深入解析mTLS的原理与实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言&#xff1a;微服务时代的通信安全挑战 随着云原生和微服务架构的普及&#xff0c;服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...

在golang中如何将已安装的依赖降级处理,比如:将 go-ansible/v2@v2.2.0 更换为 go-ansible/@v1.1.7

在 Go 项目中降级 go-ansible 从 v2.2.0 到 v1.1.7 具体步骤&#xff1a; 第一步&#xff1a; 修改 go.mod 文件 // 原 v2 版本声明 require github.com/apenella/go-ansible/v2 v2.2.0 替换为&#xff1a; // 改为 v…...