人人都会AI编程

13.2 变量与环境变量

更新时间:2026-07-12

在 Shell 中,变量是存储临时数据的容器,你可以把数字、字符串、命令输出等信息保存在变量里,在脚本或交互式会话中反复使用。理解变量和环境变量的区别及用法,是编写自动化脚本和调试系统行为的基石。

1. 变量的基本操作

Shell 变量不需要事先声明类型,直接赋值即可使用。注意:等号两边不能有空格!

name="alice"
count=42

引用变量时,在变量名前加上美元符号 $

echo $name           # 输出 alice
echo "Hello, $name"  # 双引号内会展开变量
echo 'Hello, $name'  # 单引号内不展开,原样输出 Hello, $name

为了明确变量名的边界,或者紧跟其他字符时,可以用花括号包围变量名:

file="report"
touch ${file}_2025.txt   # 创建 report_2025.txt,如果不加括号,先Shell会去找变量 file_2025

2. 命令替换:将命令输出赋值给变量

$(命令) 或反引号 ` 命令 可以将命令的标准输出捕获到变量中(推荐使用 $()`,因为它更易嵌套)。

today=$(date +%Y%m%d)
files_count=$(ls | wc -l)
echo "Today is $today, there are $files_count files."

3. 变量的作用域与 export

默认情况下,在 Shell 中创建的变量只在当前 Shell 进程中可见(这种变量又叫 局部变量Shell 变量)。当你运行一个脚本或启动一个子程序时,子进程默认无法访问父 Shell 中的这些变量。

为了让变量能被当前 Shell 启动的所有子进程继承,需要使用 export 将它提升为 环境变量

greeting="Hello"          # 仅当前 Shell 可见
export greeting="Hello"   # 或用 export greeting,使子进程也能看到

# 验证:启动子 Shell 查看
bash -c 'echo $greeting'  # 如果已 export,输出 Hello;否则空

常用操作:一次性设置并导出一个环境变量:

export PATH=$PATH:/opt/bin

取消变量用 unset

unset greeting

4. 重要的系统环境变量

系统启动和用户登录时,会自动设置一系列环境变量。以下是最常遇到的几个:

| 变量 | 含义 | 示例值 |
|------|------|--------|
| HOME | 当前用户的主目录 | /home/alice |
| USER | 当前用户名 | alice |
| PATH | 可执行程序的搜索路径,目录间用冒号分隔 | /usr/local/bin:/usr/bin:/bin |
| SHELL | 当前使用的 Shell | /bin/bash |
| PWD | 当前工作目录 | /home/alice/project |
| LANG | 语言和区域设置 | en_US.UTF-8 |

PATH 尤其关键:当你在终端输入 ls 时,Shell 会在 PATH 所列的目录中按顺序查找名为 ls 的可执行文件。若修改 PATH,务必谨慎,避免覆盖原有路径。安全添加新路径的方法是:

export PATH="$PATH:/your/new/path"

5. 查看变量

  • set:显示当前 Shell 中所有变量(包括局部变量和环境变量)及函数,输出通常较长。
  • envprintenv:只显示所有环境变量。
  • 查看单个变量:echo $PATHprintenv PATH

6. 环境变量的持久化

在交互式会话中用 export 设置的环境变量只在当前会话有效,关闭终端后丢失。要让环境变量永久生效,需要将 export 语句写入 Shell 的启动配置文件。常见配置文件及其作用范围:

  • ~/.bashrc:每次打开新的交互式 Bash Shell(如打开终端窗口)都会执行。适用于个人自定义别名、函数、PATH 添加等。
  • ~/.profile~/.bash_profile:登录 Shell(如通过 SSH 登录或 tty 登录)时执行一次。通常在这里设置环境变量,然后调用 ~/.bashrc
  • /etc/environment/etc/profile:系统级配置文件,对所有用户生效,需管理员权限修改。

范例:为自己的程序目录添加到 PATH 并持久化
~/.bashrc 文件末尾添加:

export PATH="$HOME/bin:$PATH"

保存后执行 source ~/.bashrc 或重新打开终端使其生效。

7. 变量数组(Bash 特有)

Bash 支持一维数组变量,在批量操作文件列表或多重选项时很有用:

fruits=("apple" "banana" "cherry")
echo ${fruits[0]}      # 输出 apple
echo ${fruits[@]}       # 输出所有元素 apple banana cherry
echo ${#fruits[@]}      # 数组长度 3

8. 常见坑点与最佳实践

  • 空格敏感name = value 会报错,因为 Shell 会把 name 当作命令执行,=value 当作参数。
  • 引号使用:赋值时若值包含空格或特殊字符,务必用双引号包围:msg="Hello, world";引用变量也建议用双引号 "$var" 避免单词拆分和通配符展开,除非你有意利用拆分。
  • 作用域:一个脚本内设置的变量默认不会污染父 Shell 的环境;如果运行的是点命令 . script.shsource script.sh,则脚本中的变量和函数会影响当前 Shell。
  • 安全性:避免在环境变量中存储敏感信息(如密码),因为同一个用户下的任何进程都能读取该用户的环境变量(通过 /proc/PID/environ)。对于脚本中临时使用的私密信息,应使用局部变量,并尽早 unset

掌握变量与环境变量的管理,你就能在命令行和脚本中灵活地传递数据、配置系统和控制程序行为,这是 Shell 使用能力的一道分水岭。