在Linux系统中,变量赋值是脚本编程和日常操作的基础,通过赋值命令可以存储数据、传递参数并控制程序流程,Linux中的赋值操作不仅涉及简单变量,还包括数组、环境变量、数值运算等多种场景,其语法规则和命令用法需根据变量类型和需求灵活选择,本文将详细解析Linux中赋值命令的写法,涵盖基础语法、高级用法及注意事项,帮助读者全面掌握变量赋值的技巧。

基础赋值语法:本地变量与环境变量
Linux中的变量分为本地变量(仅在当前shell会话有效)和环境变量(可传递给子进程),两者的赋值语法存在差异,核心规则是“变量名=值”,等号两侧不能有空格(这是新手常见错误)。
本地变量赋值
本地变量是默认的变量类型,仅在当前shell或脚本中有效,不会影响其他进程或子shell,赋值语法为:
变量名=值
name="Alice" # 字符串赋值(双引号支持变量解析) age=25 # 数值赋值(默认按字符串存储,需通过运算处理) path=/home/alice # 路径赋值 is_active=true # 布尔值赋值(Linux中true/false本质是字符串)
注意事项:
- 若值包含空格或特殊字符(如、),需用双引号(支持变量解析)或单引号(原样输出)包裹,
greeting="Hello, $name!"(结果为Hello, Alice!),greeting='Hello, $name!'(结果为Hello, $name!)。 - 变量名需以字母或下划线开头,不能包含空格或特殊字符(如、),推荐使用小写字母(避免与系统环境变量冲突)。
环境变量赋值
环境变量需要通过export命令声明,使其对当前shell及其子进程可见,赋值方式有两种:
- 方式1:先赋值再导出
name="Bob" export name
- 方式2:直接赋值并导出(推荐,简洁高效)
export name="Bob"
环境变量常用于配置系统环境,如
PATH(命令搜索路径)、HOME(用户家目录)等,可通过env命令查看所有环境变量。
数组赋值:索引数组与关联数组
Linux支持两种数组类型:索引数组(下标为数字,默认从0开始)和关联数组(下标为字符串,需先声明),数组赋值需使用括号,元素间用空格分隔。
索引数组赋值
索引数组是最常用的数组类型,赋值方式灵活:
- 直接初始化(推荐,简洁直观)
fruits=("apple" "banana" "cherry") - 按下标赋值(可跳过下标,后续元素自动追加)
fruits[0]="apple" fruits[2]="cherry" # fruits[1]默认为空字符串
- 动态追加元素
fruits+=("orange") # 追加到数组末尾(下标为3)
关联数组赋值
关联数组(类似字典/哈希表)需通过declare -A声明后再赋值,否则会报错:
declare -A scores # 声明关联数组 scores["math"]=90 # 按字符串下标赋值 scores["english"]=85 scores["science"]=92
注意:关联数组下标必须用双引号包裹(即使下标是纯数字),例如scores[1]=80会报错,需改为scores["1"]=80。
数组赋值对比表
| 类型 | 声明方式 | 赋值示例 | 访问方式 |
|---|---|---|---|
| 索引数组 | 无需声明 | arr=("a" "b" "c") |
${arr[0]}(第一个元素) |
| 关联数组 | declare -A |
declare -A arr; arr["x"]=1 |
${arr["x"]} |
| 数组长度 | ${#arr[@]}(获取元素个数) |
数值赋值与算术运算
Linux中变量默认存储为字符串,若需进行数值运算,需通过特定命令或语法将字符串转换为数值,常见方法包括let、、expr和bc(支持浮点数)。

let命令赋值
let是bash内置命令,用于整数运算,赋值时可直接省略(变量名前不加):
let "a=10+5" # a=15(支持表达式,需用双引号包裹) let b=a*2 # b=30(可直接引用变量) let "c++" # c自增(c=16) let "--d" # d自减(需先定义d)
注意:let运算结果会直接覆盖原变量值,且仅支持整数。
赋值
是let的简写形式,语法更简洁,无需双引号,可直接进行算术运算:
((a=10+5)) # a=15(双引号可省略) ((b=a*2)) # b=30 ((c++)) # c自增 ((--d)) # d自减
还常用于条件判断,例如((a>10))判断a是否大于10。
expr命令赋值
expr是外部命令(需单独安装),支持基础算术运算,但元素间需用空格分隔,且需用反引号`包裹:
a=`expr 10 + 5` # a=15(注意+两侧需空格) b=`expr $a * 2` # b=30(*需转义为*)
缺点:expr效率较低,且不支持浮点数,逐渐被替代。
bc命令(浮点数运算)
bc是Linux中的计算器工具,支持浮点数运算,需通过管道或重定向输入表达式:
a=10.5 b=2.3 result=$(echo "$a + $b" | bc) # result=12.8(bc默认保留整数,需通过scale设置小数位数) scale=2 result=$(echo "scale=2; $a / $b" | bc) # result=4.56(scale=2保留2位小数)
字符串赋值高级技巧
字符串赋值是Linux脚本中的高频操作,除基础语法外,还需掌握字符串拼接、截取、替换等技巧。
字符串拼接
直接将字符串与变量拼接即可,无需特殊符号:
name="Alice" greeting="Hello, " "$name" # greeting="Hello, Alice" suffix="!" full_greeting=$greeting$suffix # full_greeting="Hello, Alice!"
字符串截取
通过${变量名:起始位置:长度}截取子串(起始位置从0开始):

str="Hello, World!"
echo ${str:0:5} # 输出"Hello"(从0开始,截取5个字符)
echo ${str:7:5} # 输出"World"(从第7个字符开始,截取5个)
字符串替换
通过${变量名/旧字符串/新字符串}替换首次匹配的内容,替换所有匹配:
str="apple apple banana"
echo ${str/apple/orange} # 输出"orange apple banana"(替换首次匹配)
echo ${str//apple/orange} # 输出"orange orange banana"(替换所有匹配)
特殊变量与只读变量
Linux中还有一些系统内置的特殊变量,它们的“赋值”由系统自动完成,用户可读取但不能修改,可通过readonly声明只读变量,防止意外修改。
特殊变量
| 变量名 | 含义 | 示例(脚本test.sh执行./test.sh arg1 arg2) |
|---|---|---|
$0 |
脚本名称 | echo $0 → ./test.sh |
$1~$9 |
位置参数(命令行参数) | echo $1 → arg1 |
| 参数个数 | echo $# → 2 |
|
| 所有参数(单个字符串) | echo $* → arg1 arg2 |
|
| 所有参数(独立字符串) | for i in $@; do echo $i; done → 逐行输出arg1、arg2 |
|
| 上一条命令的退出状态 | echo $? → 0(成功)或非0(失败) |
|
| 当前进程ID(PID) | echo $$ → 返回当前shell的PID |
只读变量
通过readonly或declare -r声明只读变量,声明后无法修改或删除:
readonly constant="This cannot be changed" constant="New value" # 报错:bash: constant: readonly variable
变量赋值常见错误与避坑指南
- 等号两侧有空格:错误写法
a = 10,Linux会解析为“命令a,参数,参数10”,而a不是有效命令,会报错“command not found”。 - 未引用含空格的值:错误写法
name=Alice Smith,会被解析为name=Alice和Smith两个变量,需改为name="Alice Smith"。 - 关联数组未声明:直接赋值
arr["key"]=value会报错“bash: arr: associative array”,需先declare -A arr。 - 数值运算未使用算术命令:
a=10; b=$a+5,结果b="10+5"(字符串拼接),需改为((b=a+5))或let b=a+5。
相关问答FAQs
Q1:为什么我在脚本中定义的变量,在子shell中取不到值?
A:因为默认情况下,本地变量不会传递给子shell,若需要在子shell中使用变量,需通过export将其声明为环境变量。
#!/bin/bash export name="Alice" # 声明为环境变量 bash -c 'echo $name' # 子shell中可取到值(输出"Alice")
如果未使用export,子shell中无法访问该变量(输出空值)。
Q2:赋值时,单引号和双引号有什么区别?什么时候用哪种?
A:单引号和双引号都用于包裹字符串,但解析规则不同:
- 单引号:原样输出所有内容,不解析变量和特殊字符(如
n、)。name='Alice'; echo 'Hello, $name!'→ 输出Hello, $name!。 - 双引号:解析变量和部分特殊字符(如
n、t),但不解析命令替换(`)和算术运算。name='Alice'; echo "Hello, $name!"→ 输出Hello, Alice!。
使用场景:
- 需要原样输出字符串时(如路径、密码),用单引号;
- 需要解析变量或特殊字符时(如提示信息、动态内容),用双引号。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/14732.html