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

发布于:2025-03-13 ⋅ 阅读:(13) ⋅ 点赞:(0)

一、学习前提准备

环境要求

  • 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目录存在"
else
  echo "条件未满足"
fi

4.3 循环结构

for循环处理文件列表:

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

while按行读取文件:

while read line; do
  echo "当前行:$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/null
  return $?   # 返回上条命令的退出状态
}
​
check_service
case $? in
  0) 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等自动化工具

📚 推荐资料