在Linux系统中,变量是用于存储数据值的标识符,通过变量可以方便地在命令、脚本或程序中引用和操作数据,Linux中的变量主要分为局部变量和环境变量两类,前者仅在当前Shell会话中有效,后者则可传递给子进程,正确理解和使用变量是掌握Linux操作的关键技能之一。
变量的定义与类型
Linux中的变量按作用域可分为两类:
- 局部变量:仅在当前Shell进程中有效,定义后不会影响其他Shell或子进程。
- 环境变量:通过
export
命令导出后,可对当前Shell的所有子进程生效,常用于配置系统环境(如PATH
、HOME
等)。
还有只读变量(不可修改)和数组变量(存储多个值),但最常用的仍是局部变量和环境变量。
变量的定义语法
局部变量定义
定义局部变量的基本语法为:
变量名=变量值
注意事项:
- 等号两边不能有空格,否则系统会将其视为命令并报错(如
name = "Tom"
会报错,应为name="Tom"
)。 - 变量名只能包含字母、数字和下划线,且不能以数字开头(如
2var
无效,var_2
有效)。 - 变量名区分大小写(如
Name
和name
是两个不同的变量)。
示例:
name="Alice" # 定义字符串变量 age=25 # 定义数值变量(实际以字符串存储) path="/home/user" # 定义路径变量
环境变量定义
环境变量需通过export
命令将局部变量导出,语法有两种:
# 方式1:先定义变量,再导出 变量名=变量值 export 变量名 # 方式2:直接定义并导出(推荐) export 变量名=变量值
示例:
export JAVA_HOME="/usr/lib/jvm/java-11-openjdk" # 定义Java环境变量 export PATH="$PATH:/usr/local/bin" # 将新路径添加到PATH环境变量
只读变量定义
若需定义不可修改的变量(如常量),可使用readonly
或declare -r
命令:
readonly 变量名=变量值 # 或 declare -r 变量名=变量值
示例:
readonly VERSION="1.0.0" # 定义只读变量VERSION VERSION="2.0" # 尝试修改会报错:bash: VERSION: readonly variable
数组变量定义
数组是存储多个值的变量,Bash支持索引数组和关联数组(需先声明declare -A
)。
-
索引数组(默认,下标从0开始):
# 方式1:直接赋值 arr=("apple" "banana" "cherry") # 方式2:指定下标赋值 arr[0]="apple" arr[1]="banana" arr[2]="cherry" # 方式3:动态添加元素 arr[3]="date"
-
关联数组(键值对,需先声明):
declare -A fruit_dict fruit_dict["apple"]="red" fruit_dict["banana"]="yellow"
变量的引用与操作
变量引用
引用变量时需在变量名前加符号,或使用${变量名}
(推荐,避免歧义):
echo $name # 输出变量name的值 echo ${age} # 输出变量age的值 echo "Hello, ${name}!" # 字符串中引用变量
变量展开与操作
Bash支持丰富的变量展开语法,用于处理默认值、替换、截取等操作:
| 语法 | 功能说明 | 示例 | 结果 |
|——————–|————————————————————————–|——————————-|——————–|
| ${变量名:-默认值}
| 变量未定义或为空时,返回默认值;否则返回变量值 | echo ${name:-"Guest"}
| 若name
未定义,输出”Guest” |
| ${变量名:=默认值}
| 变量未定义或为空时,设置变量值为默认值并返回 | echo ${name:="Tom"}
| 设置name="Tom"
并输出”Tom” |
| ${变量名:?错误信息}
| 变量未定义或为空时,输出错误信息并退出脚本 | echo ${name:?"未定义name"}
| 若name
未定义,报错并退出 |
| ${变量名#模式}
| 从变量值开头删除最短匹配模式 | path="/home/user"; echo ${path#*/}
| 输出”home/user” |
| ${变量名##模式}
| 从变量值开头删除最长匹配模式 | path="/home/user"; echo ${path##*/}
| 输出”user” |
| ${变量名%模式}
| 从变量值末尾删除最短匹配模式 | file="test.txt"; echo ${file%.*}
| 输出”test” |
| ${变量名%%模式}
| 从变量值末尾删除最长匹配模式 | file="archive.tar.gz"; echo ${file%%.*}
| 输出”archive” |
| ${变量名/旧值/新值}
| 替换变量值中第一个匹配的旧值 | name="Tom Jerry"; echo ${name/Tom/Jerry}
| 输出”Jerry Jerry” |
| ${变量名//旧值/新值}
| 替换变量值中所有匹配的旧值 | name="Tom Jerry"; echo ${name//Tom/Jerry}
| 输出”Jerry Jerry” |
变量的删除
使用unset
命令可删除已定义的变量(只读变量除外):
unset name # 删除局部变量name export unset age # 删除环境变量age(实际为`unset age`,export为修饰符)
不同Shell下的变量定义
默认Linux Shell为Bash,若使用其他Shell(如Zsh、Fish),变量定义语法可能略有不同:
- Zsh:环境变量导出需用
export
或typeset -x
,数组定义语法与Bash类似。 - Fish:变量定义无需符号,直接用
set name "Alice"
,环境变量用set -x name "Alice"
。
Linux中变量的定义需根据作用域选择语法:局部变量用变量名=值
,环境变量用export 变量名=值
,只读变量用readonly
,数组需用括号赋值,变量引用时推荐${变量名}
形式,并通过展开语法实现灵活操作,掌握变量定义与使用是编写Shell脚本、管理Linux系统的基础。
相关问答FAQs
Q1:如何查看当前Shell中定义的所有变量?
A:使用set
命令可查看所有局部变量和环境变量(包括函数),若仅想查看环境变量,可用env
或printenv
命令。
set # 查看所有变量(输出较多) env | grep PATH # 查看PATH环境变量
Q2:如何定义一个全局环境变量,使其对所有用户生效?
A:全局环境变量需写入系统配置文件,如/etc/profile
(对所有用户生效,登录时加载)或用户家目录下的~/.bashrc
(仅对当前用户生效),编辑文件后,使用source
命令或重新登录使配置生效。
# 编辑/etc/profile(需root权限) echo "export MY_VAR="Hello, All Users!"" >> /etc/profile source /etc/profile # 立即生效
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/35851.html