在Linux系统中,脚本编程是自动化任务、提升工作效率的核心技能之一,而变量赋值作为脚本编程的基础操作,贯穿于脚本的各个层面,从简单的数据存储到复杂的数据处理,都离不开对变量的正确赋值与使用,本文将围绕Linux脚本中的赋值操作,从基础语法到高级应用,结合实例进行系统阐述,帮助读者全面掌握这一关键技能。

变量赋值的基础语法
在Linux脚本中,变量是存储数据值的容器,赋值是向容器中填充数据的过程,变量赋值的基本语法为 变量名=变量值,需注意以下几点核心规则:
-
变量名命名规范
变量名只能包含字母、数字和下划线,且不能以数字开头,建议使用有意义的名称,如user_name而非u1,同时避免与系统关键字(如if、for)冲突,变量名默认区分大小写,User和user被视为不同的变量。 -
赋值操作符与空格
赋值时必须使用 ,且两侧不能有空格,这是最常见的初学者错误,name = Alice(错误)会导致系统报错,正确写法为name=Alice,若变量值包含空格,需用引号括起来,如greeting="Hello World"。 -
变量值的类型
Linux脚本中的变量默认不区分数据类型,但根据赋值方式可分为三类:- 字符串变量:直接赋文本值,如
message="Welcome"。 - 数值变量:赋数字值,可用于算术运算,如
count=100。 - 环境变量:通过
export命令导出,对子进程可见,如export PATH=$PATH:/new/path。
- 字符串变量:直接赋文本值,如
变量的赋值方式
根据数据来源的不同,变量赋值可分为直接赋值、命令赋值和用户输入赋值三种主要方式,每种方式适用于不同的场景。
直接赋值
直接赋值是最简单的方式,适用于在脚本中固定数据的存储。
#!/bin/bash script_name="deploy.sh" version="1.0" author="Admin" echo "脚本名称: $script_name, 版本: $version, 作者: $author"
输出结果为:脚本名称: deploy.sh, 版本: 1.0, 作者: Admin。
$变量名 的形式用于引用变量的值,若需原样输出变量名(如调试时),可使用 \ 转义或用单引号括起。
命令赋值
将命令的执行结果赋值给变量,是脚本自动化处理的关键,常用格式有两种:
- 反引号方式:`
`command`,反引号内的命令会被优先执行,输出结果作为变量值。 - 美元括号方式:
$(command),推荐使用此方式,支持嵌套且可读性更强。
获取当前系统时间并赋值给变量:
current_time=$(date "+%Y-%m-%d %H:%M:%S")
echo "当前时间: $current_time"
# 嵌套命令示例:获取系统负载并计算平均值
load_1min=$(uptime | awk -F'load average:' '{print $2}' | cut -d',' -f1)
avg_load=$(echo "$load_1min" | bc -l)
echo "1分钟平均负载: $avg_load"
反引号方式在复杂嵌套时易出错,而 $(command) 可以清晰嵌套,如 result=$(ls $(dirname $0))。

用户输入赋值
通过 read 命令实现交互式赋值,适用于需要动态获取用户数据的场景。read 常用参数包括:
-p:显示提示信息,如read -p "请输入用户名: " username。-s:隐藏输入内容,常用于密码输入,如read -s "请输入密码: " password。-n:限制输入字符数,如read -n 1 -p "确认是否继续?(y/n): " choice。
示例:用户登录脚本片段
#!/bin/bash
read -p "请输入用户名: " username
read -s -p "请输入密码: " password
echo -e "\n登录中..."
if [ "$username" = "admin" ] && [ "$password" = "123456" ]; then
echo "登录成功!"
else
echo "用户名或密码错误!"
fi
变量值的处理技巧
赋值完成后,常需对变量值进行截取、替换、拼接等操作,Linux脚本提供了丰富的字符串处理方法。
字符串截取
${变量名:起始位置:长度}:从指定位置开始截取指定长度的子串。
str="HelloWorld",则${str:0:5}输出Hello,${str:5:5}输出World。${变量名#*字符}:从开头删除到第一个指定字符(非贪婪匹配)。
path="/usr/local/bin",${path#*/}输出usr/local/bin。${变量名##*字符}:从开头删除到最后一个指定字符(贪婪匹配)。
filename="test.tar.gz",${filename##*.}输出gz。
字符串替换
${变量名/旧字符串/新字符串}:替换第一个匹配项。
msg="error: not found",${msg/error/warning}输出warning: not found。${变量名//旧字符串/新字符串}:替换所有匹配项。
text="apple apple banana",${text/apple/orange}输出orange orange banana。
变量拼接
直接将变量与字符串或另一变量相邻排列即可实现拼接:
first_name="Zhang" last_name="San" full_name="$first_name $last_name" # 输出 "Zhang San" greeting="Hello, $full_name!" echo "$greeting" # 输出 "Hello, Zhang San!"
数值变量的算术运算
对于数值类型的变量,可通过多种方式实现算术运算,常见方法包括:
expr 命令
传统但效率较低的方式,需注意运算符两侧需加空格,乘法需用 \ 转义:
a=10 b=5 sum=$(expr $a + $b) product=$(expr $a \* $b) echo "和: $sum, 积: $product"
双括号运算
推荐使用,支持C语言风格的运算符,无需转义,效率更高:
a=10 b=5 ((sum=a+b)) ((product=a*b)) echo "和: $sum, 积: $product" # 自增自减操作 ((a++)) echo "a自增后: $a" # 输出 11
bc 命令
支持浮点数运算,需通过管道或重定向输入:
result=$(echo "scale=2; 10/3" | bc) # scale=2保留两位小数 echo "10除以3的结果: $result" # 输出 3.33
特殊变量的赋值与应用
除自定义变量外,Linux脚本还提供了多种特殊变量,可直接获取系统或脚本运行时的信息:
$0:脚本名称$1-$9:位置参数,对应脚本执行时的第1-9个参数- 参数个数
- 所有参数(单个字符串,用IFS分隔)
- 所有参数(多个字符串,保留参数分隔符)
- 上一条命令的退出状态码(0表示成功,非0表示失败)
- 当前进程的PID
示例:参数处理脚本

#!/bin/bash
echo "脚本名称: $0"
echo "参数个数: $#"
echo "所有参数: $@"
echo "第一个参数: $1"
echo "最后一个参数: ${!#}" # ${!#}动态获取第$#个参数
执行 ./script.sh arg1 arg2 arg3,输出:
脚本名称: ./script.sh
参数个数: 3
所有参数: arg1 arg2 arg3
第一个参数: arg1
最后一个参数: arg3
变量赋值的最佳实践
-
避免全局变量污染:尽量使用
local关键字在函数内定义局部变量,避免与全局变量冲突。func() { local temp="局部变量" echo "$temp" } echo "$temp" # 输出空(未定义) -
使用大写命名环境变量:自定义环境变量建议用大写字母(如
APP_HOME),与系统环境变量(如PATH)区分。 -
变量引用前检查定义:通过
${变量名:-默认值}处理未定义情况,避免脚本报错。config_file=${CONFIG_FILE:-"/etc/default/config"} echo "配置文件路径: $config_file"若
CONFIG_FILE未定义,则使用默认值/etc/default/config。 -
敏感信息安全处理:密码、密钥等敏感信息避免直接硬编码在脚本中,可通过
read -s或从安全存储(如密钥管理服务)动态获取。
变量赋值是Linux脚本编程的基石,从基础的直接赋值到复杂的命令处理与数值运算,再到特殊变量的灵活应用,掌握赋值规则与技巧是编写高效、健脚脚本的前提,通过遵循命名规范、选择合适的赋值方式、结合字符串处理与算术运算,并遵循最佳实践,开发者可以构建出结构清晰、可维护性强的自动化脚本,充分发挥Linux系统的自动化能力。


















