Shell脚本-变量如何定义
一、前言
在 Shell 脚本编程中,变量 是最基本的数据存储单元。它用于保存字符串、数字、命令执行结果等信息,是实现脚本逻辑和数据处理的基础。
本文将带你全面了解 Shell 脚本中变量的定义方式,包括:
✅ 变量的基本定义语法
✅ 变量命名规则
✅ 变量赋值的多种方式
✅ 局部变量与只读变量的定义
✅ 环境变量的定义与导出
✅ 实战案例:变量定义在日志处理、备份脚本、部署脚本中的应用
✅ 常见问题与解决方案
并通过完整示例帮助你掌握 Shell 脚本中变量的定义技巧。
二、Shell 脚本中变量的定义方式
✅ 1. 基本定义语法
Shell 中变量定义非常简单,使用 变量名=值
的方式即可:
name="ethan"
age=25
📌 注意: =
两边不能有空格,否则会报错。
# 错误写法
name = "ethan" # ❌ 报错:command not found
✅ 2. 使用变量
定义后使用 $变量名
或 ${变量名}
来引用变量:
echo "姓名是:$name"
echo "年龄是:${age}"
📌 使用 ${变量名}
的好处是:可以防止变量名与其他字符混淆。
echo "文件名是:${name}_file.txt" # 输出:文件名是:ethan_file.txt
三、变量命名规则
Shell 变量的命名需遵循以下规则:
规则 | 说明 |
---|---|
只能包含字母、数字和下划线 | my_var , var1 , _count |
不能以数字开头 | ❌ 1var (非法),✅ var1 (合法) |
区分大小写 | Var 与 var 是两个不同的变量 |
不能包含空格或特殊字符 | ❌ my var ,✅ my_var |
推荐使用大写字母表示环境变量 | MY_VAR |
四、变量赋值的多种方式
✅ 1. 直接赋值
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 -p "请输入你的名字:" name
echo "你好,$name"
-p
:显示提示信息-s
:静默输入(常用于密码)
read -sp "请输入密码:" password
echo -e "\n密码长度为:${#password}"
✅ 4. 从脚本参数赋值
通过 $1
到 $9
接收脚本参数:
#!/bin/bashfilename="$1"
if [ -f "$filename" ]; thenecho "文件 $filename 存在"
elseecho "文件 $filename 不存在"
fi
执行:
./check_file.sh /etc/passwd
五、局部变量与函数内部变量
在函数中使用 local
关键字定义局部变量,防止变量污染全局作用域:
greet() {local message="你好"echo "$message,$1"
}
📌 local
只能在函数中使用。
六、只读变量(常量)
使用 readonly
定义只读变量,防止变量被修改:
readonly PI=3.14
PI=3.1415 # ❌ 报错:PI is read-only
📌 常用于配置项、路径、最大尝试次数等。
七、环境变量的定义与导出
✅ 1. 定义环境变量
使用 export
将变量导出为环境变量,使其对当前 Shell 及其子进程可见:
export PATH="/usr/local/bin:$PATH"
📌 常见环境变量包括:
HOME
:用户主目录USER
:当前用户名PATH
:命令搜索路径PWD
:当前工作目录
✅ 2. 查看所有环境变量
printenv
或查看特定变量:
echo $HOME
八、变量的默认值与空值处理
使用 ${变量名:-默认值}
设置默认值,当变量未定义或为空时使用默认值:
name=${name:-"默认用户"}
echo "用户名:$name"
使用 ${变量名:=默认值}
不仅设置默认值,还会将默认值赋值给变量:
name=${name:="默认用户"}
使用 ${变量名:?错误信息}
当变量为空时报错:
name=${name:?"变量不能为空"}
九、实战案例:变量定义在 Shell 脚本中的应用
✅ 案例1:自动备份脚本
#!/bin/bashreadonly 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/bashlogfile="/var/log/syslog"
error_count=$(grep -c "ERROR" "$logfile")if [ "$error_count" -gt 0 ]; thenecho "发现 $error_count 个错误日志"
elseecho "没有发现错误日志"
fi
📌 使用变量保存命令执行结果,便于后续判断。
✅ 案例3:用户登录检查脚本
#!/bin/bashread -p "请输入用户名:" username
read -sp "请输入密码:" passwordif [ "$username" == "admin" ] && [ "$password" == "123456" ]; thenecho -e "\n登录成功"
elseecho -e "\n登录失败"
fi
📌 使用变量接收用户输入,用于条件判断。
十、变量定义的最佳实践
原则 | 说明 |
---|---|
命名清晰 | 如 backup_dir 比 dir 更明确 |
使用只读变量保存常量 | 如 readonly MAX_RETRY=3 |
函数中使用局部变量 | 使用 local 避免变量污染 |
避免使用无意义变量名 | 如 a , b , temp 等 |
统一使用双引号包裹变量 | 防止空格导致错误 |
合理使用变量扩展语法 | 如 ${var:-default} 设置默认值 |
十一、常见问题与解决方案
问题 | 原因 | 解决方案 |
---|---|---|
变量未生效 | 使用了单引号或未赋值 | 改用双引号或检查赋值语法 |
报错 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" | 对子进程可见 |
十三、结语
感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!