linux shell中设置变量默认值用${var:-default}(只读兜底,不修改原变量)和${var:=default}(赋值兜底,写入变量),前者适用于位置参数、环境变量等读取场景,后者用于内部变量初始化。

Linux Shell 中设置变量默认兜底值,核心是用 ${var:-default} 和 ${var:=default} 这两种参数扩展语法,它们能自动应对变量未定义或为空的情况,避免脚本因缺失配置而中断。
用 ${var:-default} 提供只读式默认值
该语法在变量 未定义 或 值为空字符串 时返回默认值,但不会改变原变量本身。适合读取型场景,比如解析命令行参数、环境变量或配置项。
- 示例:
env=${1:-"dev"}—— 若调用脚本时没传第一个参数,env就是"dev",但$1本身不变 - 可安全用于位置参数(
$1、$2)、环境变量($HOME)甚至未声明的变量 - 不修改原始变量,适合多次判断同一变量是否有效
用 ${var:=default} 实现赋值式兜底
该语法同样在变量未定义或为空时返回默认值,但会把默认值真正写入变量中。适合需要后续复用该值、或希望变量状态被“初始化”的情况。
- 示例:
PORT=${PORT:=8080}—— 如果$PORT原来为空或没定义,执行后它就变成8080 - 注意:不能对位置参数(如
$1)使用:=,否则报错;仅适用于普通变量名 - 常用于脚本开头批量初始化配置变量,让后续逻辑始终有可用值
实际搭配建议
多数脚本推荐组合使用:对外部输入(如 $1、$ENV)用 :- 安全读取;对内部变量(如 LOG_DIR、TIMEOUT)用 := 主动初始化。
- 例如:
config_file=${CONFIG_FILE:-"/etc/app.conf"}(读取配置路径,不改原变量) - 再如:
log_dir=${log_dir:="/var/log/myapp"}(确保内部变量有值,后续可直接用) - 调试时可用
set -u检查未定义变量,配合默认值语法提升健壮性











