一、Shell 编程规范
规范的 Shell 脚本不仅能提升可读性,还能避免很多隐性错误,以下是行业通用的核心规范:
1. 脚本头部(Shebang)
- 必须以 #!/bin/bash(或 #!/bin/sh)开头,指定脚本解释器,系统会根据这行找到对应的 Shell 解释器执行脚本。
- 示例:
bash
运行
#!/bin/bash
# 注释:这是一个规范的Shell脚本开头
2. 脚本注释规范
- 单行注释用 # 开头,关键逻辑、复杂计算、参数说明必须加注释。
- 脚本开头建议添加 “脚本说明块”,包含:脚本功能、作者、创建时间、版本、参数说明等。示例:
bash
运行
#!/bin/bash
# 脚本名称:demo.sh
# 功能:演示Shell规范和变量使用
# 作者:xxx
# 创建时间:2026-02-24
# 版本:v1.0
# 使用说明:直接执行,无需参数
3. 命名规范
- 脚本名:小写字母 + 下划线,避免大写和特殊字符,如 system_check.sh(而非 SystemCheck.sh)。
- 变量名:大写字母 + 下划线,见名知意,如 MAX_MEMORY、LOG_FILE_PATH。
- 函数名:小写字母 + 下划线,动词 + 名词,如 check_disk_usage。
4. 格式规范
- 缩进:统一用 4 个空格(避免 Tab,不同编辑器 Tab 宽度可能不一致)。
- 行尾:避免多余空格,每行代码长度控制在 80 字符内(过长可换行,用 \\ 连接)。
- 空格:运算符(=、==、+ 等)两侧加空格,如 a = 10(而非 a=10,提升可读性)。
5. 执行权限与编码
- 脚本必须赋予执行权限:chmod +x 脚本名.sh。
- 编码统一用 UTF-8,避免中文乱码(可通过 set fileencoding 检查)。
二、Shell 变量
变量是 Shell 脚本存储数据的核心,分为系统变量、用户自定义变量、特殊变量三类,以下是核心用法:
1. 变量的基本操作(自定义变量)
(1)定义变量
- 语法:变量名=值(等号两侧无空格,这是新手最易出错的点)。
- 规则:变量名只能包含字母、数字、下划线,且不能以数字开头。
- 示例:
bash
运行
# 正确定义
NAME="张三"
AGE=25
PI=3.14# 错误定义(等号两侧有空格)
# AGE = 25 # 执行会报错
(2)使用变量
- 语法:$变量名 或 ${变量名}(推荐用 ${},避免变量名与后续字符混淆)。
- 示例:
bash
运行
#!/bin/bash
NAME="张三"
echo "姓名:$NAME" # 输出:姓名:张三
echo "姓名:${NAME}" # 输出:姓名:张三(推荐)
echo "${NAME}的年龄是25" # 输出:张三的年龄是25(无${}会识别错误)
(3)修改变量
- 直接重新赋值即可,无需额外声明。
- 示例:
bash
运行
AGE=25
echo "修改前:$AGE" # 输出:修改前:25
AGE=26
echo "修改后:$AGE" # 输出:修改后:26
(4)删除变量
- 语法:unset 变量名,删除后变量不可用。
- 示例:
bash
运行
AGE=25
unset AGE
echo $AGE # 输出空行(变量已被删除)
2. 系统变量
系统预定义的变量,可直接使用,常用的有:
表格
| $0 | 当前脚本的文件名 |
| $1-$9 | 脚本的第 1-9 个参数(执行脚本时传入,如 ./demo.sh 10 20,则 $1=10,$2=20) |
| $# | 脚本传入的参数个数 |
| $* | 所有参数(作为一个整体) |
| $@ | 所有参数(作为独立个体) |
| $? | 上一条命令的执行状态(0 表示成功,非 0 表示失败) |
| $$ | 当前脚本的进程 ID(PID) |
示例(演示系统变量):
bash
运行
#!/bin/bash
# 脚本名:sys_var.sh
echo "脚本名:$0" # 输出:脚本名:./sys_var.sh
echo "第1个参数:$1" # 执行./sys_var.sh 10 20 时,输出:第1个参数:10
echo "参数个数:$#" # 执行./sys_var.sh 10 20 时,输出:参数个数:2
echo "上一条命令状态:$?" # 输出:0(上一条echo命令执行成功)
执行测试:
bash
运行
chmod +x sys_var.sh
./sys_var.sh 10 20
# 输出:
# 脚本名:./sys_var.sh
# 第1个参数:10
# 参数个数:2
# 上一条命令状态:0
3. 特殊变量(环境变量 / 只读变量)
(1)环境变量
作用于整个系统,可通过 export 声明,让子进程继承变量。示例:
bash
运行
# 临时设置环境变量(仅当前会话有效)
export PATH=$PATH:/usr/local/bin # 追加自定义路径到系统PATH
export LANG=zh_CN.UTF-8 # 设置字符编码
# 永久生效:将上述命令写入 ~/.bashrc 或 /etc/profile,执行 source ~/.bashrc 生效
(2)只读变量
用 readonly 声明,声明后无法修改 / 删除。示例:
bash
运行
readonly VERSION="1.0"
VERSION="2.0" # 执行报错:-bash: VERSION: 只读变量
unset VERSION # 执行报错:-bash: unset: VERSION: 无法取消设定: 只读变量
三、变量的进阶用法
1. 变量替换(常用场景)
表格
| ${变量:-默认值} | 变量为空 / 未定义时,使用默认值(变量本身不变) |
| ${变量:=默认值} | 变量为空 / 未定义时,使用默认值并赋值给变量 |
| ${变量:?提示信息} | 变量为空 / 未定义时,输出提示信息并终止脚本 |
示例:
bash
运行
#!/bin/bash
# 变量为空时用默认值
echo "${NAME:-未知}" # NAME未定义,输出:未知
# 变量为空时赋值并使用
echo "${AGE:=18}" # AGE未定义,输出18,且AGE=18
echo $AGE # 输出:18
# 变量为空时终止脚本
# echo "${SEX:?SEX变量未定义}" # 执行报错:./demo.sh: 行10: SEX: SEX变量未定义
2. 变量运算
Shell 默认是字符串处理,数值运算需用 $((运算式)) 或 expr:
bash
运行
a=10
b=5
# 加法
echo $((a + b)) # 输出:15
# 减法
echo $((a – b)) # 输出:5
# 乘法(注意*需要转义,或用(( )))
echo $((a * b)) # 输出:50
echo `expr $a \\* $b` # 输出:50
