Shell 变量

💡 Shell 变量

学习目标:
掌握 Shell 中变量的基本概念、定义方式和使用方法,理解变量在脚本编写与自动化运维中的作用,并能结合实际案例灵活运用。


🎯 学习目标

  1. 理解什么是 Shell 变量及其基本用法。
  2. 掌握变量的命名规则与赋值方式。
  3. 了解局部变量与全局变量的区别。
  4. 能够使用环境变量完成基础任务。
  5. 掌握变量替换、引用与扩展技巧。
  6. 理解特殊变量(如 $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 中定义的所有变量? 使用 setdeclare 命令。
修改了环境变量后是否立即生效? 需要重新加载配置文件(如 .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

📚 推荐阅读

  1. 《Advanced Bash-Scripting Guide》——TLDP 官方文档,涵盖变量、数组、函数等高级内容。
  2. 《鸟哥的 Linux 私房菜》——Shell 编程章节,适合初学者入门。
  3. 《Linux Shell Scripting Cookbook》——实用脚本编写指南,包含大量实战案例。
  4. 《Unix/Linux Shell Programming》——系统讲解 Shell 编程思想。
  5. man bash → VARIABLES 章节 ——官方手册权威解释。

🧭 下一步建议

接下来我们将学习:

《Shell 条件判断与流程控制》

你将掌握:

  • ifcasetest 等条件判断语句的使用;
  • forwhileuntil 循环结构;
  • 结合变量与判断实现复杂逻辑;
  • 错误处理与调试技巧。

如果你准备好了,请告诉我:“下一步:《Shell 条件判断与流程控制》” 我将继续为你制作下一章内容。🧩📚🚀

posted @ 2023-04-02 13:44  红尘过客2022  阅读(48)  评论(0)    收藏  举报