Shell 变量
💡 Shell 变量
学习目标:
掌握 Shell 中变量的基本概念、定义方式和使用方法,理解变量在脚本编写与自动化运维中的作用,并能结合实际案例灵活运用。
🎯 学习目标
- 理解什么是 Shell 变量及其基本用法。
- 掌握变量的命名规则与赋值方式。
- 了解局部变量与全局变量的区别。
- 能够使用环境变量完成基础任务。
- 掌握变量替换、引用与扩展技巧。
- 理解特殊变量(如
$0,$1,$$,$?)的作用。
🔑 核心重点(一句话概括)
Shell 变量是用于存储数据的容器,它没有类型限制,支持字符串、数字等格式,在脚本开发中广泛用于流程控制、参数传递和状态记录。
📚 详细讲解
1️⃣ 什么是 Shell 变量?
- 定义:Shell 变量是用户自定义或系统预设的符号名称,用来保存特定的数据值。
- 特点:
- 没有固定类型,所有变量都以字符串形式保存;
- 变量名区分大小写;
- 不需要声明即可直接赋值使用。
✅ 示例:
name="Linux"
echo "Hello, $name"
输出:
Hello, Linux
2️⃣ 变量的定义与赋值
✅ 基本语法:
variable_name=value
- 注意:等号两边不能有空格!
✅ 示例:
OS=Ubuntu
version=22.04
echo "$OS version is $version"
输出:
Ubuntu version is 22.04
3️⃣ 局部变量 vs 全局变量(环境变量)
| 类型 | 定义方式 | 作用范围 |
|---|---|---|
| 局部变量 | 直接赋值(如 var=abc) |
仅在当前 Shell 进程中有效 |
| 环境变量 | 使用 export var=value |
对当前 Shell 及其子进程有效 |
✅ 示例:
local_var="I'm local"
export global_var="I'm global"
bash -c 'echo "local_var: $local_var"; echo "global_var: $global_var"'
输出:
local_var:
global_var: I'm global
4️⃣ 特殊变量
| 变量 | 含义 |
|---|---|
$0 |
当前脚本的文件名 |
$1 ~ $9 |
第1~第9个位置参数 |
$@ / $* |
所有位置参数 |
$# |
位置参数的数量 |
| $$ | 当前 Shell 的 PID |
$? |
上一条命令的退出状态码(0 表示成功) |
✅ 示例:
#!/bin/bash
echo "Script name: $0"
echo "Number of arguments: $#"
echo "First argument: $1"
echo "Exit code of last command: $?"
运行:
./script.sh hello world
输出:
Script name: ./script.sh
Number of arguments: 2
First argument: hello
Exit code of last command: 0
5️⃣ 变量引用与扩展
✅ 引用方式:
- 单引号
'value':不进行变量替换 - 双引号
"value":进行变量替换 - 无引号:自动展开,但可能引起错误(如含空格)
✅ 示例:
name="Shell Scripting"
echo 'Hello, $name' # 输出:Hello, $name
echo "Hello, $name" # 输出:Hello, Shell Scripting
6️⃣ 变量的删除与只读设置
✅ 删除变量:
unset variable_name
✅ 设置只读变量:
readonly PI=3.14
PI=3.14159 # 报错:cannot assign to readonly variable
⚠️ 注意事项
| 问题 | 建议 |
|---|---|
| 变量名能否带空格? | ❌ 不能,变量名中不允许有空格。 |
| 是否必须使用双引号? | ✅ 最佳实践,避免因空格导致脚本出错。 |
| 如何查看当前 Shell 中定义的所有变量? | 使用 set 或 declare 命令。 |
| 修改了环境变量后是否立即生效? | 需要重新加载配置文件(如 .bashrc)或新开终端。 |
| 变量未赋值就使用会怎样? | Shell 会将其视为空字符串处理,可能导致逻辑错误。 |
🧪 实际案例分析
🧪 案例一:判断脚本是否被正确调用
#!/bin/bash
if [ $# -lt 1 ]; then
echo "Usage: $0 <filename>"
exit 1
fi
filename=$1
if [ -f "$filename" ]; then
echo "$filename exists."
else
echo "$filename does not exist."
fi
说明:
- 使用
$#判断是否传入参数; - 使用
$1获取第一个参数; - 使用
-f检查文件是否存在。
🧪 案例二:日志备份脚本 + 时间戳变量
#!/bin/bash
LOG_DIR="/var/log"
BACKUP_DIR="/backup/logs"
DATE=$(date +%Y%m%d)
mkdir -p "$BACKUP_DIR"
tar -czvf "$BACKUP_DIR/logs_$DATE.tar.gz" "$LOG_DIR" > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo "Backup completed successfully."
else
echo "Backup failed!"
fi
说明:
- 使用
$(...)捕获命令结果; - 使用
$?判断上条命令是否执行成功; - 结合变量实现动态备份文件名。
🧩 拓展练习(动手实践题)
✍️ 练习一:编写一个脚本,输出你的用户名和主目录
username=$(whoami)
home_dir=$HOME
echo "Username: $username"
echo "Home Directory: $home_dir"
✍️ 练习二:编写一个脚本,接收两个参数并交换它们的值
a=$1
b=$2
echo "Before swap: a=$a, b=$b"
temp=$a
a=$b
b=$temp
echo "After swap: a=$a, b=$b"
运行:
./swap.sh apple banana
输出:
Before swap: a=apple, b=banana
After swap: a=banana, b=apple
✍️ 练习三:编写一个脚本,判断是否为 root 用户运行
if [ $(id -u) -ne 0 ]; then
echo "Error: This script must be run as root."
exit 1
fi
echo "You are root user. Proceeding..."
✍️ 练习四:编写一个脚本,创建 10 个临时文件,文件名为 tmp_1.txt ~ tmp_10.txt
for i in {1..10}; do
touch "tmp_$i.txt"
done
📚 推荐阅读
- 《Advanced Bash-Scripting Guide》——TLDP 官方文档,涵盖变量、数组、函数等高级内容。
- 《鸟哥的 Linux 私房菜》——Shell 编程章节,适合初学者入门。
- 《Linux Shell Scripting Cookbook》——实用脚本编写指南,包含大量实战案例。
- 《Unix/Linux Shell Programming》——系统讲解 Shell 编程思想。
- man bash → VARIABLES 章节 ——官方手册权威解释。
🧭 下一步建议
接下来我们将学习:
《Shell 条件判断与流程控制》
你将掌握:
if、case、test等条件判断语句的使用;for、while、until循环结构;- 结合变量与判断实现复杂逻辑;
- 错误处理与调试技巧。
如果你准备好了,请告诉我:“下一步:《Shell 条件判断与流程控制》” 我将继续为你制作下一章内容。🧩📚🚀

浙公网安备 33010602011771号