在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