linux-Shell 编程-常用 Shell 脚本技巧

news/2024/9/19 12:00:15/ 标签: linux, 运维, 服务器

Linux Shell 编程:常用 Shell 脚本技巧

一、概述

Shell 脚本是 Linux 系统管理员和开发人员日常自动化任务的重要工具。通过编写 Shell 脚本,用户可以自动化重复性工作、简化系统维护、管理服务器资源等。Shell 脚本的强大之处在于其简洁和灵活性,并且与 Linux 系统的命令行工具无缝集成。


二、基本 Shell 编程结构

在编写 Shell 脚本时,首先要了解基本的语法结构,如变量、条件判断、循环和函数等。以下是常用的 Shell 编程基础。

1. 变量与变量操作

1.1 定义与引用变量

在 Shell 中,变量的定义和引用非常简单:

# 定义变量
name="John Doe"# 引用变量时需要加 $ 符号
echo "Hello, $name!"

注意:在赋值时等号 = 两边不能有空格。

1.2 变量类型

Shell 中的变量默认都是字符串类型,不需要显式声明变量类型。可以使用 $(( )) 来执行算术运算:

a=5
b=10
sum=$((a + b))
echo "Sum is $sum"
1.3 读取用户输入

使用 read 命令读取用户输入:

echo "Enter your name:"
read name
echo "Hello, $name!"

2. 条件判断

条件判断在 Shell 脚本中非常重要,通常用于判断文件、字符串或数值的状态。

2.1 数值比较

在 Shell 脚本中,可以使用 if 语句来进行条件判断。常用的数值比较符号包括:

  • -eq:等于
  • -ne:不等于
  • -lt:小于
  • -le:小于等于
  • -gt:大于
  • -ge:大于等于

示例:

num=5
if [ $num -gt 3 ]; thenecho "Number is greater than 3"
fi
2.2 字符串比较

字符串比较使用 =!= 进行:

str="hello"
if [ "$str" = "hello" ]; thenecho "The string is hello"
fi
2.3 文件操作

Shell 提供了一些用于检查文件状态的条件:

  • -e:文件是否存在
  • -d:是否为目录
  • -f:是否为普通文件
  • -r:是否可读
  • -w:是否可写
  • -x:是否可执行

示例:

file="/etc/passwd"
if [ -f "$file" ]; thenecho "The file exists and is a regular file"
fi

3. 循环

循环语句用于重复执行某些任务,Shell 支持 for 循环和 while 循环。

3.1 for 循环

for 循环通常用于遍历列表或范围:

for i in 1 2 3 4 5; doecho "Number: $i"
done

也可以使用 seq 命令来生成范围:

for i in $(seq 1 5); doecho "Number: $i"
done
3.2 while 循环

while 循环根据条件重复执行,直到条件为 false

counter=1
while [ $counter -le 5 ]; doecho "Counter: $counter"counter=$((counter + 1))
done

三、常用 Shell 编程技巧

1. 使用 case 进行多重条件判断

当有多个条件需要判断时,可以使用 case 语句代替复杂的 if-elif-else 结构。case 语句特别适合处理多种输入的情况。

echo "Enter a number between 1 and 3:"
read numbercase $number in1)echo "You entered one";;2)echo "You entered two";;3)echo "You entered three";;*)echo "Invalid number";;
esac

2. 管道与重定向

在 Shell 脚本中,管道(|)用于将一个命令的输出传递给另一个命令,重定向则用于将输出保存到文件中。

2.1 管道操作

使用管道可以将多个命令串联起来,例如:

ls /etc | grep "conf"

这将列出 /etc 目录下所有包含 conf 的文件。

2.2 输出重定向

使用 > 将输出重定向到文件,>> 表示追加到文件末尾:

echo "This is a log entry" > log.txt  # 覆盖写入
echo "Another log entry" >> log.txt  # 追加写入
2.3 输入重定向

使用 < 将文件内容作为命令的输入:

while read line; doecho "Line: $line"
done < file.txt

3. 函数的使用

Shell 脚本支持定义函数来组织代码并重用。函数可以让脚本更简洁、更易维护。

3.1 定义与调用函数

函数的定义与调用非常简单:

my_function() {echo "Hello, this is a function"
}# 调用函数
my_function
3.2 带参数的函数

Shell 函数可以接收参数,通过 $1$2 等访问参数:

greet() {echo "Hello, $1!"
}greet "Alice"  # 输出 "Hello, Alice!"

4. 处理命令行参数

在编写脚本时,经常需要处理传递给脚本的参数。Shell 提供了一些内置变量来处理命令行参数。

  • $#:参数的数量
  • $@:所有参数
  • $1$2 等:第一个、第二个参数

示例:

echo "You passed $# arguments."
echo "The first argument is $1"

5. 定时任务与 cron

定时执行脚本在系统维护中非常常见,cron 是 Linux 中的任务调度工具。

5.1 使用 crontab 配置定时任务

通过 crontab 配置定时任务可以定时执行脚本。crontab 的语法格式为:

* * * * * command

每个 * 分别代表:分钟、小时、日期、月份、星期。

示例:每天晚上 10 点运行 /path/to/script.sh

0 22 * * * /path/to/script.sh

使用 crontab -e 打开编辑器配置定时任务。

6. Shell 脚本的调试

在调试复杂的 Shell 脚本时,可以使用 set -x 开启调试模式,跟踪每一条命令的执行过程,或者使用 set +x 关闭调试模式。

示例:

#!/bin/bash
set -x  # 开启调试模式
echo "This is a test script"
set +x  # 关闭调试模式

这样在脚本执行时,会详细打印每个命令的执行过程,有助于定位问题。

7. 处理退出状态

每个命令执行完成后都会返回一个退出状态码($?),0 表示成功,非 0 表示失败。可以根据状态码判断上一个命令是否执行成功。

示例:

ls /nonexistentfile
if [ $? -ne 0 ]; thenecho "The file does not exist."
fi

四、Shell 脚本实用技巧总结

  1. 自动化文件备份:定期备份文件并压缩。

    tar -czf backup_$(date +%F).tar.gz /path/to/directory
    
  2. 日志管理:将脚本执行的日志记录到文件。

    ./my_script.sh >> script.log 2>&1
    
  3. 批量处理文件:遍历目录中的所有文件并执行操作。

    for file in /path/to/directory/*; doecho "Processing $file

"
done


4. **系统监控脚本**:定时监控 CPU、内存、磁盘使用情况,并发送警告邮件。
```bash
#!/bin/bash
usage=$(df / | grep / | awk '{ print $5 }' | sed 's/%//g')
if [ $usage -gt 80 ]; thenecho "Disk space is critical: $usage%" | mail -s "Disk Space Alert" admin@example.com
fi
  1. 环境变量:利用环境变量在脚本中传递信息。
    export PATH=/custom/path:$PATH
    

五、总结

通过学习并掌握上述 Shell 编程技巧,可以让 Linux 用户高效编写脚本,自动化各种任务并提高系统管理的效率。Shell 编程虽然简单,但功能强大,能够在 Linux 系统的各个层面上灵活运用。


http://www.ppmy.cn/news/1527630.html

相关文章

手势识别-Yolov5模型-自制数据集训练

1、源码下载&#xff1a; 大家可以直接在浏览器搜索yolov5即可找到官方链接&#xff0c;跳转进github进行下载&#xff1a; 这里对yolov5模型补充说明一下&#xff0c;它是存在较多版本的&#xff0c;具体信息可在master->tags中查看&#xff0c;大家根据需要下载。这些不同…

Golang如何优雅的退出程序

Golang如何优雅的退出程序 在 Go 中优雅地退出程序&#xff0c;通常需要处理一些清理工作&#xff0c;如关闭文件、网络连接、释放资源等。以下是一些常见的方法&#xff1a; 一、使用 os.Signal 和 signal.Notify 捕获系统信号&#xff1a;可以使用 os/signal 包来捕获中断…

Android中如何处理运行时权限?

在Android中&#xff0c;处理运行时权限是开发过程中一个至关重要的环节&#xff0c;它自Android 6.0&#xff08;API级别23&#xff09;引入&#xff0c;旨在提高用户隐私保护和应用的透明度。以下将详细阐述Android中处理运行时权限的方法、步骤、注意事项以及相关的最佳实践…

最优化理论与自动驾驶(十一):基于iLQR的自动驾驶轨迹跟踪算法(c++和python版本)

最优化理论与自动驾驶&#xff08;四&#xff09;&#xff1a;iLQR原理、公式及代码演示 之前的章节我们介绍过&#xff0c;iLQR&#xff08;迭代线性二次调节器&#xff09;是一种用于求解非线性系统最优控制最优控制最优控制和规划问题的算法。本章节介绍采用iLQR算法对设定…

使用阿里OCR身份证识别

1、开通服务 免费试用 2、获取accesskay AccessKeyId和AccessKeySecret 要同时复制保存下来 因为后面好像看不AccessKeySecret了 3.Api 参考 https://help.aliyun.com/zh/ocr/developer-reference/api-ocr-api-2021-07-07-recognizeidcard?spma2c4g.11186623.0.0.7a9f4b1e5C…

STM32快速复习(十二)FLASH闪存的读写

文章目录 一、FLASH是什么&#xff1f;FLASH的结构&#xff1f;二、使用步骤1.标准库函数2.示例函数 总结 一、FLASH是什么&#xff1f;FLASH的结构&#xff1f; 1、FLASH简介 &#xff08;1&#xff09;STM32F1系列的FLASH包含程序存储器、系统存储器和选项字节三个部分&…

AcWing算法基础课-789数的范围-Java题解

大家好&#xff0c;我是何未来&#xff0c;本篇文章给大家讲解《AcWing算法基础课》789 题——数的范围。本文详细解析了一个基于二分查找的算法题&#xff0c;题目要求在有序数组中查找特定元素的首次和最后一次出现的位置。通过使用两个二分查找函数&#xff0c;程序能够高效…

随机规划及其MATLAB实现

目录 引言 随机规划的基本模型 随机动态规划 随机动态规划建模实例​(随机动态规划)&#xff1a; MATLAB中的随机规划实现 示例&#xff1a;两阶段随机规划 表格总结&#xff1a;随机规划求解方法与适用场景 结论 引言 随机规划&#xff08;Stochastic Programming&…

VulhubDC-4靶机详解

项目地址 https://download.vulnhub.com/dc/DC-4.zip实验过程 将下载好的靶机导入到VMware中&#xff0c;设置网络模式为NAT模式&#xff0c;然后开启靶机虚拟机 使用nmap进行主机发现&#xff0c;获取靶机IP地址 nmap 192.168.47.1-254根据对比可知DC-4的一个ip地址为192.1…

C++——多态的原理

多态的原理 多态的原理引入虚函数表 多态的原理 引入 如下代码的输出结果为&#xff08;&#xff09; A.编译报错 B.运行报错 C.8 D.12 上⾯题⽬运⾏结果12bytes&#xff0c;除了_b和_ch成员&#xff0c;还多⼀个__vfptr放对象的前⾯(注意有些平台可能会放到对象的最后⾯&am…

web基础—dvwa靶场(七)SQL Injection

SQL Injection&#xff08;SQL注入&#xff09; SQL Injection&#xff08;SQL注入&#xff09;&#xff0c;是指攻击者通过注入恶意的SQL命令&#xff0c;破坏SQL查询语句的结构&#xff0c;从而达到执行恶意SQL语句的目的。SQL注入漏洞的危害是巨大的&#xff0c;常常会导致…

AI绘画:科技赋能艺术的崭新时代

&#x1f4af;AI绘画&#xff1a;走进艺术创新的新时代 人工智能在改变世界的过程中&#xff0c;AI绘画工具逐渐成为创新的典范。 本文将为您揭示AI绘画背后的技术秘密、潜在的应用场景&#xff0c;并为您推荐几款出色的AI绘画工具&#xff0c;助您领略这一技术带来的艺术新体…

git bash中执行java命令乱码问题处理

Git Bash中执行java命令显示乱码 购机自带windows字符集为gbk&#xff0c;git bash默认为utf8&#xff0c;导致中文字符显示乱码 处理方案如下 顶部右键点击Options 选择Text&#xff0c;更换字符集即可

彩蛋岛 销冠大模型案例

彩蛋岛 销冠大模型案例 任务&#xff1a; https://kkgithub.com/InternLM/Tutorial/tree/camp3/docs/EasterEgg/StreamerSales 视频 https://www.bilibili.com/video/BV1f1421b7Du/?vd_source4ffecd6d839338c9390829e56a43ca8d 项目git地址&#xff1a; https://kkgithu…

VideoPlayer插件的用法

文章目录 1. 概念介绍2. 使用方法2.1 实现步骤2.2 具体细节 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何获取文件类型"相关的内容&#xff0c;本章回中将介绍如何播放视频.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 播放视频是我们常用…

[深度学习]Pytorch框架

1 深度学习简介 应用领域&#xff1a;语音交互、文本处理、计算机视觉、深度学习、人机交互、知识图谱、分析处理、问题求解 2 发展历史 1956年人工智能元年2016年国内开始关注深度学习2017年出现Transformer框架2018年Bert和GPT出现2022年&#xff0c;chatGPT出现&#xff0…

C++11新特性学习

C11 1. C11新特性 自动类型推导&#xff08;auto&#xff09;智能指针&#xff08;提供更安全和更高效的内存管理&#xff09;移动语义和右值引用 (move语义 &&&#xff0c;使得对象移动而非拷贝&#xff0c;在处理大量数据时提高程序性能)Lambda 表达式&#xff08;…

idea连接docker 自动化部署

进入Linux服务器 vim /lib/systemd/system/docker.service将 ExecStart/usr/bin/dockerd -H fd:// --containerd/run/containerd/containerd.sock 替换为 ExecStart/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock新建文件 Dockerfile配置Dockerfile文…

CTF比赛中的Git相关题目解题思路

在CTF比赛中&#xff0c;涉及Git相关的题目通常会考察参赛者对Git仓库的了解&#xff0c;尤其是如何利用公开或不完整的Git仓库来恢复源代码或获取敏感信息。本文将结合一些常见的工具和步骤&#xff0c;详细介绍如何解决这类题目。 背景 Git是一种分布式版本控制系统&#…

中国农业银行——开源软件一体化管理平台

【金融机构开源技术应用创新成果案例 第十二期】 中国农业银行——开源软件一体化管理平台 申报单位:中国农业银行股份有限公司 技术领域:开源软件管理 技术产品:Git、Gitea、Spring-boot、Mybatis 业务场景:开源软件准入、使用、安全治理、目录发布、内外部开源等 应…