Linux Shell 脚本编程极简入门指南

devtools/2025/3/13 14:01:11/

一、学习前提准备

环境要求

  • Linux系统(Ubuntu/CentOS等)或 WSL (Windows用户)

  • 任意文本编辑器(推荐VSCode/Vim)

  • 基础命令行操作能力

🔍 验证环境

# 查看系统默认Shell
echo $SHELL
# 查看Bash版本
bash --version 

二、Shell脚本基础认知

2.1 什么是Shell脚本?

  • 解释型语言:通过/bin/bash逐行解析执行

  • 核心价值

    • 自动化重复性系统操作(80%运维工作可脚本化)

    • 快速实现任务调度(结合cron)

    • 提升操作可重复性和精确度

2.2 脚本文件标准结构

#!/bin/bash           # Shebang声明(必须第1行)
# 文件:demo.sh        # 脚本描述
# 作者:CSDN用户       # 维护信息
​
echo "欢迎学习Shell编程"   # 可执行语句

三、首个Shell脚本实战

3.1 创建并运行脚本

# 创建脚本文件(建议.sh后缀)
touch hello_world.sh  
chmod +x hello_world.sh  # 添加执行权限

3.2 编辑器输入以下代码

#!/bin/bash
# 第一个Shell程序
echo "当前用户:$(whoami)"
echo "系统时间:$(date +%F)"

3.3 三种执行方式对比

执行方式命令示例适用场景
路径直接执行./hello_world.sh已添加执行权限时
指定解释器执行bash hello_world.sh调试快速执行
source命令执行source hello_world.sh需保留环境变量时

四、核心编程语法精要

4.1 变量操作

company="CSDN社区"          # 定义变量(等号无空格)
readonly version="1.0"     # 只读变量(不可修改)
today=$(date +%Y-%m-%d)    # 命令执行结果赋值
echo "${company} ${today}" # 建议变量用花括号包裹

4.2 条件分支结构

if [ -f "/etc/passwd" ]; then     # 判断文件存在echo "系统密码文件存在"
elif [ -d "/tmp" ]; then          # 判断目录存在echo "/tmp目录存在"
elseecho "条件未满足"
fi

4.3 循环结构

for循环处理文件列表:

for file in *.log; doecho "正在处理日志文件:${file}"
done

while按行读取文件:

while read line; doecho "当前行:$line"
done < input.txt

4.4 函数定义与调用

# 带返回值函数
file_exists() {[ -f "$1" ] && return 0 || return 1
}
​
# 调用函数
file_exists /etc/hosts
if [ $? -eq 0 ]; then    # $?获取上一条命令返回值echo "文件存在"
fi

五、实用功能模块速查

5.1 参数传递处理

特殊变量含义示例
$0脚本名称echo "脚本:$0"
$1-$9第1-9个位置参数echo "第1参数:$1"
$#参数总个数if [ $# -gt 0 ]
$@所有参数列表for param in $@

5.2 退出状态码

check_service() {systemctl is-active nginx >/dev/nullreturn $?   # 返回上条命令的退出状态
}
​
check_service
case $? in0) echo "服务运行中";;*) echo "服务异常,状态码:$?";;
esac

5.3 管道与重定向

# 管道组合命令
cat access.log | grep "404" | awk '{print $7}'
​
# 输出重定向
ls -l > file_list.txt    # 覆盖写入
echo "新增内容" >> log.txt # 追加写入
​
# 错误输出处理
apt update 2> /dev/null  # 丢弃错误输出

六、自动化实战:系统备份脚本

6.1 需求说明

  • 每日凌晨压缩备份/data目录

  • 自动删除30天前的备份文件

  • 记录操作日志

6.2 完整代码实现

#!/bin/bash
# 自动化备份脚本
​
# 配置参数
backup_dir="/data"
dest_path="/backup"
keep_days=30
log_file="/var/log/backup.log"
​
# 目录检查
[ ! -d "$dest_path" ] && mkdir -p "$dest_path"
[ ! -f "$log_file" ] && touch "$log_file"
​
# 生成压缩包
timestamp=$(date +%Y%m%d%H%M)
tar -czf "${dest_path}/backup_${timestamp}.tar.gz" "$backup_dir" 2>&1 | tee -a "$log_file"
​
# 清理旧备份
find "$dest_path" -name "*.tar.gz" -mtime +$keep_days -delete 2>&1 | tee -a "$log_file"
​
# 日志记录
echo "[$(date)] 备份完成,保留最近${keep_days}天文件" | tee -a "$log_file"

6.3 部署到cron计划任务

# 每日凌晨2点执行
crontab -e
# 添加如下行
0 2 * * * /opt/scripts/backup.sh

七、高阶调试技巧

7.1 执行过程追踪

bash -x script.sh  # 显示每条执行命令

7.2 代码段调试

set -x   # 开启调试模式
# 需要调试的代码
set +x   # 关闭调试模式

7.3 错误自动退出

#!/bin/bash
set -e   # 任何语句返回值非0则立即退出
set -o pipefail  # 管道命令出错时也退出

八、学习路线与资源推荐

🔥 技能提升路线

  1. 掌握正则表达式(grep/sed)

  2. 学习awk高级文本处理

  3. 理解Linux信号处理(trap)

  4. 研究Ansible等自动化工具

📚 推荐资料

  • 书籍:《Linux命令行与Shell脚本编程大全》

  • 工具:ShellCheck在线检测


http://www.ppmy.cn/devtools/166790.html

相关文章

Spring Boot 中如何使用 `@RequestHeader` 注解

文章目录 学习文章&#xff1a;Spring Boot 中如何使用 RequestHeader 注解 一、RequestHeader 注解简介常用属性&#xff1a; 二、基本用法1. 提取单个请求头2. 处理可选请求头 三、提取多个请求头1. 使用多个 RequestHeader 注解2. 使用 Map 提取所有请求头 四、处理多值请求…

植物学(botany)这个单词怎么记?牛吃草,草是一种植物

植物学&#xff08;botany&#xff09;这个单词怎么记&#xff1f; botany n.植物学 botany 这个单词&#xff0c;词源上来自 botanic 一词&#xff1a; botanic a.植物学的 SYN: botanical(a.植物学的) 因此&#xff0c;英语词根botan-&#xff0c;意为“植物”。比如&…

3.3.2 Proteus第一个仿真图

文章目录 文章介绍0 效果图1 新建“点灯”项目2 添加元器件3 元器件布局接线4 补充 文章介绍 本文介绍&#xff1a;使用Proteus仿真软件画第一个仿真图 0 效果图 1 新建“点灯”项目 修改项目名称和路径&#xff0c;之后一直点“下一步”直到完成 2 添加元器件 点击元…

Mysql高频面试题

MVCC相关面试题 1.什么是 MVCC?它解决了什么问题? 答:MVCC 是多版本并发控制机制,它通过维护数据多个版本,实现非锁定读,解决了读写互斥问题,通过保存数据的多个版本,让读操作可以在不获取锁的情况下读取数据,提高了并发性能。同时,MVCC 还能保证事务的隔离性,例如…

CopyOnWriteArrayList 的实现原理和适用场景(源码)

CopyOnWriteArrayList的实现原理 目录 CopyOnWriteArrayList的实现原理核心源码解读&#xff08;1&#xff09;数据结构&#xff1a;采用数组&#xff08;2&#xff09;初始化&#xff08;3&#xff09;add 操作&#xff08;4&#xff09;get操作&#xff08;5&#xff09;remo…

Pygame实现射击鸭子游戏3-3

6 游戏配置设置 游戏配置设置的代码如图10所示。 图10 游戏配置设置的代码 其中&#xff0c;第32行代码初始化pygame&#xff1b;第33-34行代码设置了屏幕的宽度和高度&#xff1b;第35行代码设置了鸭子的数量&#xff1b;第36行代码创建屏幕&#xff1b;第37行代码设置屏幕的…

SQL-留存率

一、留存率业务含义 留存率可以评用户对产品的粘性&#xff0c;留存率越低用户对产品的粘性越小 留存率通常分为次日留存率、3日留存率、7日留存率、30日留存率 这里以新增用户留存率为例&#xff1a; 次日留存率&#xff1a;(基准日之后的第1天留存的用户数)/基准日当天新…

C++和标准库速成(一)——HelloWorld和名称空间

目录 1. 引言1. 简单小程序"Hello World"1.1 模块导入1.2 预处理指令1.2.1 简介1.2.2 常用的预处理指令 1.3 main()函数1.4 输入输出流1.4.1 输出流1.4.2 转义字符1.4.3 输入流 2. 名称空间2.1 定义名称空间2.2 using指令2.3 嵌套名称空间2.4 名称空间别名 参考 1. 引…