1️⃣ Shell 是什么?
Shell 是用户与 Linux 内核之间的命令解释器,它接收用户输入的命令,调用系统内核执行,并将结果返回给用户。Shell 脚本则是把一系列命令组织成文件,实现批量自动化处理。
常见 Shell 种类
| Shell 名称 | 特点 | 配置文件 |
|---|---|---|
bash | 最流行,Linux 默认 Shell,兼容 sh | ~/.bashrc / ~/.bash_profile |
sh | POSIX 标准,多为 bash/dash 的符号链接 | — |
zsh | 功能最丰富,macOS 默认 | ~/.zshrc |
dash | 轻量快速,Ubuntu /bin/sh 默认 | — |
fish | 语法友好,自动补全强 | ~/.config/fish/ |
本教程使用 Bash查看当前 Shell:
echo $SHELL,查看系统支持的 Shell:cat /etc/shells2️⃣ 第一个 Shell 脚本
脚本结构规范
#!/bin/bash # ================================================== # 脚本名称: hello.sh # 功能描述: 第一个 Shell 脚本示例 # 作 者: 运维工程师 # 创建时间: 2026-05-21 # ================================================== echo "Hello, Shell 脚本世界!" echo "当前用户:$(whoami)" echo "当前时间:$(date '+%Y-%m-%d %H:%M:%S')" echo "主机名:$HOSTNAME" echo "工作目录:$PWD" bash
shebang 详解
脚本第一行 #!/bin/bash 称为 shebang(#!),告诉系统用哪个解释器执行该文件。
#!/bin/bash # 最常用,指定 bash 解释器 #!/usr/bin/env bash # 更可移植,从 PATH 中找 bash(推荐) #!/bin/sh # POSIX 兼容,功能较少 bash
推荐写法生产脚本推荐用
#!/usr/bin/env bash,移植性更好,不依赖 bash 的固定路径。3️⃣ 三种执行方式
# 方式一:赋予执行权限后直接运行(最常用) chmod +x hello.sh ./hello.sh # 方式二:用 bash 命令解释器执行 bash hello.sh # 方式三:source 执行(在当前 Shell 环境中执行,会影响当前环境变量) source hello.sh # 或简写为 . hello.sh bash
| 执行方式 | 是否需要权限 | 子 Shell? | 适用场景 |
|---|---|---|---|
./script.sh | 需要 +x | 是(子 Shell) | 正式运行脚本 |
bash script.sh | 不需要 | 是(子 Shell) | 调试/测试 |
source script.sh | 不需要 | 否(当前 Shell) | 加载配置/函数库 |
4️⃣ 调试技术
bash 调试选项
# -x:追踪模式,打印每条执行的命令(最常用) bash -x hello.sh # -n:语法检查,不执行脚本 bash -n hello.sh # -e:遇到错误立即退出 bash -e hello.sh # 组合使用 bash -xeuo pipefail hello.sh bash
在脚本内部开启调试
#!/bin/bash set -x # 从这里开始调试 echo "这里会被追踪" set +x # 关闭调试 echo "这里不追踪" bash
set 严格模式(推荐写在每个脚本顶部)
#!/bin/bash set -euo pipefail # -e: 命令失败时立即退出 # -u: 使用未定义变量时报错 # -o pipefail: 管道中任意命令失败则整体失败 bash
注意
set -e 在某些情况下可能导致意外退出,比如 grep 没找到匹配时返回1。初学阶段可暂不使用,理解错误处理后再启用。5️⃣ 基础命令回顾
文件与目录操作
# 常用文件操作命令 ls -lah # 列出详细文件列表(含隐藏文件) pwd # 打印当前目录 cd /path/to/dir # 切换目录 mkdir -p a/b/c # 递归创建目录 cp -r src/ dst/ # 递归复制 mv old.txt new.txt # 移动/重命名 rm -rf dir/ # 递归删除(谨慎!) find . -name "*.sh" # 查找文件 bash
文本查看
cat file.txt # 查看全部内容 head -n 20 file.txt # 查看前20行 tail -f /var/log/syslog # 实时追踪日志 less file.txt # 分页查看 wc -l file.txt # 统计行数 bash
权限相关
# 文件权限说明 # -rwxr-xr-x 1 user group size date filename # ||||||||||| # |++++++++++ 三组权限:owner / group / others # r=读(4) w=写(2) x=执行(1) chmod 755 script.sh # owner:rwx, group:r-x, others:r-x chmod +x script.sh # 给所有人加执行权限 chown user:group file.txt bash
6️⃣ 注释与代码风格
#!/usr/bin/env bash # 单行注释用 # : ' 多行注释方法一:用冒号命令配合单引号 这里的内容不会被执行 注意冒号和单引号之间有空格 ' # 规范的脚本头部模板 ################################################################################ # Script Name : backup.sh # Description : 每日自动备份脚本 # Author : 你的名字 # Date : 2026-05-21 # Version : 1.0 # Usage : ./backup.sh [options] ################################################################################ bash
7️⃣ 特殊变量预览
以下变量在脚本中非常常用,今天先认识,后面详细学习:
| 变量 | 含义 |
|---|---|
$0 | 脚本自身的名称 |
$1 ~ $9 | 命令行第1到第9个参数 |
$# | 命令行参数的个数 |
$@ | 所有参数(推荐使用) |
$? | 上一条命令的退出状态码(0=成功) |
$$ | 当前脚本的进程 ID(PID) |
$! | 最近一个后台进程的 PID |
$LINENO | 当前行号(调试用) |
🏋️ 今日练习
- 创建目录
~/shell-learn,在其中创建hello.sh,输出欢迎信息、当前用户、日期时间 - 用三种方式分别执行该脚本,观察区别
- 故意写一个语法错误,用
bash -n检测,再用bash -x跟踪 - 编写一个脚本,打印所有特殊变量($0, $#, $@, $?, $$)的值
- 尝试在脚本头部加入
set -euo pipefail,执行一个不存在的命令,观察结果