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

一、学习前提准备

环境要求

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

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

  • 基础命令行操作能力

🔍 验证环境

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

二、Shell脚本基础认知

2.1 什么是Shell脚本?

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

  • 核心价值

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

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

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

2.2 脚本文件标准结构

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

三、首个Shell脚本实战

3.1 创建并运行脚本

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

3.2 编辑器输入以下代码

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

3.3 三种执行方式对比

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

四、核心编程语法精要

4.1 变量操作

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

4.2 条件分支结构

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

4.3 循环结构

for循环处理文件列表:

bash 复制代码
for file in *.log; do
  echo "正在处理日志文件:${file}"
done

while按行读取文件:

bash 复制代码
while read line; do
  echo "当前行:$line"
done < input.txt

4.4 函数定义与调用

bash 复制代码
# 带返回值函数
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 退出状态码

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

5.3 管道与重定向

bash 复制代码
# 管道组合命令
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 完整代码实现

bash 复制代码
#!/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计划任务

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

七、高阶调试技巧

7.1 执行过程追踪

bash 复制代码
bash -x script.sh  # 显示每条执行命令

7.2 代码段调试

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

7.3 错误自动退出

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

八、学习路线与资源推荐

🔥 技能提升路线

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

  2. 学习awk高级文本处理

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

  4. 研究Ansible等自动化工具

📚 推荐资料

相关推荐
开开心心就好1 小时前
发票合并打印工具,多页布局设置实时预览
linux·运维·服务器·windows·pdf·harmonyos·1024程序员节
火车叼位1 小时前
脚本伪装:让 Python 与 Node.js 像原生 Shell 命令一样运行
运维·javascript·python
css趣多多1 小时前
add组件增删改的表单处理
java·服务器·前端
予枫的编程笔记1 小时前
【Linux进阶篇】从基础到实战:grep高亮、sed流编辑、awk分析,全场景覆盖
linux·sed·grep·awk·shell编程·文本处理三剑客·管道命令
Sheep Shaun1 小时前
揭开Linux的隐藏约定:你的第一个文件描述符为什么是3?
linux·服务器·ubuntu·文件系统·缓冲区
Tfly__2 小时前
在PX4 gazebo仿真中加入Mid360(最新)
linux·人工智能·自动驾驶·ros·无人机·px4·mid360
野犬寒鸦2 小时前
从零起步学习并发编程 || 第七章:ThreadLocal深层解析及常见问题解决方案
java·服务器·开发语言·jvm·后端·学习
陈桴浮海2 小时前
【Linux&Ansible】学习笔记合集二
linux·学习·ansible
迎仔2 小时前
06-存储设备运维进阶:算力中心的存储管家
运维
生活很暖很治愈2 小时前
Linux——环境变量PATH
linux·ubuntu