Shell脚本变量完全指南
变量基础概念
变量是计算机编程中的基本概念,用于存储数值或表示特定含义的数据。在Shell脚本中,变量通过名称来标识和访问,理解变量的使用规则对于编写高效的Shell脚本至关重要。
变量命名与赋值规则
Shell变量的命名需要遵循特定规则:
- 变量名由字母、数字和下划线组成,禁止以数字开头
- 使用等号进行赋值,赋值符号两侧不能存在空格
- 变量可存储整数和字符串两种基本类型
- 字符串赋值时建议使用引号包裹,含有空格的内容必须使用引号
单引号与双引号的作用不同:单引号内所有内容保持原样输出,双引号内若包含变量则会进行变量替换。
$ MY_VAR=100
$ STR1="${MY_VAR}"
$ STR2='${MY_VAR}'
$ echo $STR1
100
$ echo $STR2
${MY_VAR}
调用变量时需在变量名前加美元符号。若需拼接变量值与字符串,建议使用双引号或${变量名}形式。
$ APP=nginx
$ echo $APP
nginx
$ echo ${APP}conf
nginxconf
$ echo "$APP"conf
nginxconf
$ echo $APPconf //变量名连续可能导致意外结果
conf
变量类型详解
按功能分类
Shell变量按其作用可分为以下四类:
1. 环境变量
环境变量存储系统运行环境相关信息,通常使用大写字母命名。通过env命令可查看当前会话的所有环境变量。
$ env
USER=developer
HOME=/home/developer
PATH=/usr/local/bin:/usr/bin:/bin
SHELL=/bin/bash
TERM=xterm-256color
LANG=zh_CN.UTF-8
PWD=/home/developer
...
系统命令的执行依赖于PATH环境变量,Shell会按照PATH指定的路径顺序查找可执行文件。
$ which ls
/bin/ls
$ file /bin/ls
/bin/ls: ELF 64-bit LSB executable
2. 用户自定义变量
用户根据实际需求自行创建的变量,仅在当前Shell会话中生效。
$ CUSTOM_VAR=hello
$ echo $CUSTOM_VAR
hello
3. 位置参数变量
用于向脚本传递参数,变量名由系统固定定义:
- $0 - 脚本文件名
- $1, $2, $3... - 第1、2、3个参数
- ${10} - 第10个及以上参数需使用花括号
$ cat test.sh
#!/bin/bash
echo "脚本名称: $0"
echo "第一个参数: $1"
echo "第三个参数: $3"
$ bash test.sh alpha beta gamma
脚本名称: test.sh
第一个参数: alpha
第三个参数: gamma
$ bash /home/developer/test.sh a b c
脚本名称: /home/developer/test.sh
第一个参数: a
第三个参数: c
4. 预定义变量
Shell内置的已定义变量,具有固定用途,不可自定义命名。
按作用域分类
1. 全局变量
即环境变量,其作用范围覆盖整个系统会话,不会随脚本执行结束而消失。
2. 局部变量
仅在定义它的程序或脚本内部有效,包括用户自定义变量、位置参数变量和预定义变量。
变量操作
删除变量
使用unset命令可删除已定义的变量,删除后变量将不存在。
$ TEMP=123
$ echo $TEMP
123
$ unset TEMP
$ echo $TEMP
环境变量管理
临时环境变量
仅在当前Shell会话中有效,会话结束后失效。
$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/sbin
$ PATH=/opt/tools:$PATH
$ echo $PATH
/opt/tools:/usr/local/bin:/usr/bin:/bin:/sbin
$ myscript.sh
hello
使用export命令可使环境变量对子Shell进程可见:
$ export NEW_PATH=/usr/local/app:$PATH
永久环境变量
将变量写入配置文件可实现永久生效:
- /etc/profile - 系统全局配置,影响所有用户
- /etc/bashrc - Shell全局配置
- ~/.bashrc - 当前用户Shell配置
- ~/.bash_profile - 当前用户登录环境配置
配置文件加载顺序:/etc/profile → /etc/bashrc → ~/.bashrc → ~/.bash_profile。同名变量后加载的配置会覆盖先前的值。
# vim /etc/profile
# 在文件末尾添加
MYENV="persistent_value"
# 重新加载配置
# source /etc/profile
# 或
# . /etc/profile
# 验证结果
# echo $MYENV
persistent_value
特殊变量
Shell提供了一系列具有特殊含义的预定义变量:
- $# - 传递给脚本的参数总数
- $* - 所有参数合并成的字符串
- $$ - 当前Shell进程的PID
- $? - 上一个命令的退出状态(0表示成功,非0表示失败)
- $! - 最近后台任务的PID