一、前言
在 Shell 脚本编程中,变量 是最基础、最核心的数据结构。它用于存储字符串、数字、命令执行结果等信息,是实现脚本自动化、逻辑控制和数据处理的关键。
本文将带你全面了解 Shell 脚本中变量的 6 种定义方式,包括:
✅ 基本赋值方式
✅ 命令替换赋值
✅ 用户输入赋值
✅ 脚本参数赋值
✅ 局部变量与只读变量
✅ 环境变量的定义与导出
✅ 实战案例:变量在日志分析、备份、部署脚本中的应用
✅ 常见问题与解决方案
并通过完整示例帮助你掌握每种定义方式的使用场景和最佳实践。
二、Shell 脚本中变量的 6 种定义方式
✅ 方式1:基本赋值(直接赋值)
这是最常见、最基础的变量定义方式,语法为 变量名=值。
name="ethan"
age=25
📌 注意:
=两侧不能有空格,否则会被 Shell 解释为命令。- 字符串建议使用双引号包裹,避免空格导致解析错误。
# ❌ 错误写法
name = "ethan" # 报错:name: command not found
# ✅ 正确写法
name="ethan"
✅ 方式2:命令替换赋值(保存命令执行结果)
使用 $(命令) 或反引号 `命令` 将命令的输出结果赋值给变量。
current_time=$(date +"%Y-%m-%d %H:%M:%S")
echo "当前时间:$current_time"
ip_address=`hostname -I`
echo "本机IP:$ip_address"
📌 推荐使用 $(...) 形式,因为:
- 更清晰易读
- 支持嵌套
- 避免与单引号混淆
✅ 方式3:从用户输入赋值(read 命令)
使用 read 命令从终端读取用户输入并赋值给变量。
read -p "请输入你的名字:" name
echo "你好,$name"
常用选项:
-p:显示提示信息-s:静默输入(常用于密码)-n:限制输入字符数-t:设置超时时间
read -sp "请输入密码:" password
echo -e "\n密码已输入"
✅ 方式4:从脚本参数赋值(位置参数)
通过 $1 到 $9 接收传递给脚本的参数。
#!/bin/bash
filename="$1"
if [ -f "$filename" ]; then
echo "文件 $filename 存在"
else
echo "文件 $filename 不存在"
fi
执行脚本:
./check_file.sh /etc/passwd
📌 其他常用参数变量:
$0:脚本名称$#:参数个数$@:所有参数列表$*:所有参数合并为一个字符串
✅ 方式5:局部变量与只读变量
(1)局部变量(使用 local)
在函数中使用 local 定义局部变量,防止变量污染全局命名空间。
greet() {
local message="你好"
echo "$message,$1"
}
📌 local 只能在函数中使用。
(2)只读变量(使用 readonly)
使用 readonly 定义只读变量,防止变量被修改。
readonly PI=3.14
PI=3.1415 # ❌ 报错:PI is read-only
📌 常用于配置项、路径、最大尝试次数等。
✅ 方式6:环境变量的定义与导出
使用 export 将变量导出为环境变量,使其对当前 Shell 及其子进程可见。
export PATH="/usr/local/bin:$PATH"
📌 常见环境变量包括:
HOME:用户主目录USER:当前用户名PATH:命令搜索路径PWD:当前工作目录
查看所有环境变量:
printenv
或查看特定变量:
echo $HOME
三、变量定义的最佳实践
| 原则 | 说明 |
|---|---|
| ✅ 使用有意义的变量名 | 如 backup_dir 比 dir 更明确 |
| ✅ 使用只读变量保存常量 | 如 readonly MAX_RETRY=3 |
| ✅ 函数中使用局部变量 | 使用 local 避免变量污染 |
| ❌ 避免使用无意义变量名 | 如 a, b, temp 等 |
| ✅ 统一使用双引号包裹变量 | 防止空格导致错误 |
| ✅ 合理使用变量扩展语法 | 如 ${var:-default} 设置默认值 |
四、实战案例:变量定义在 Shell 脚本中的应用
✅ 案例1:自动备份脚本
#!/bin/bash
readonly BACKUP_DIR="/backup/$(date +%Y%m%d)"
readonly SOURCE_DIR="/var/www/html"
mkdir -p "$BACKUP_DIR"
tar -czf "$BACKUP_DIR/backup.tar.gz" "$SOURCE_DIR"
echo "备份完成:$BACKUP_DIR"
📌 使用 readonly 定义常量路径,使用命令替换生成动态目录名。
✅ 案例2:日志分析脚本
#!/bin/bash
logfile="/var/log/syslog"
error_count=$(grep -c "ERROR" "$logfile")
if [ "$error_count" -gt 0 ]; then
echo "发现 $error_count 个错误日志"
else
echo "没有发现错误日志"
fi
📌 使用变量保存命令执行结果,便于后续判断。
✅ 案例3:用户登录检查脚本
#!/bin/bash
read -p "请输入用户名:" username
read -sp "请输入密码:" password
if [ "$username" == "admin" ] && [ "$password" == "123456" ]; then
echo -e "\n登录成功"
else
echo -e "\n登录失败"
fi
📌 使用 read 接收用户输入,用于条件判断。
五、常见问题与解决方案
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 变量未生效 | 使用了单引号或未赋值 | 改用双引号或检查赋值语法 |
报错 bad substitution | 字符串处理语法错误 | 检查 ${var:0:5} 等用法 |
| 中文乱码 | 编码不一致 | 设置 LANG=en_US.UTF-8 或使用 UTF-8 编码 |
| 脚本执行异常 | 语法错误 | 使用 bash -n script.sh 检查语法 |
| 环境变量未生效 | 未使用 export | 添加 export 导出变量 |
六、总结对比表:Shell 变量定义方式一览
| 定义方式 | 示例 | 适用场景 |
|---|---|---|
| 基本赋值 | name="ethan" | 简单值赋值 |
| 命令替换赋值 | time=$(date) | 保存命令执行结果 |
| 用户输入赋值 | read name | 接收用户输入 |
| 脚本参数赋值 | filename="$1" | 接收脚本参数 |
| 局部变量 | local var="temp" | 函数内部有效 |
| 只读变量 | readonly PI=3.14 | 不能修改的常量 |
| 环境变量 | export PATH="/usr/local/bin:$PATH" | 对子进程可见 |
七、结语
感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!
Shell脚本变量的6种定义方式
4227

被折叠的 条评论
为什么被折叠?



