Shell脚本中变量赋值${VAR:-DEFAULT}的用法

在 Shell 脚本中,将变量赋值给另一个变量时,可以通过 参数扩展语法 设置默认值。以下是常见的用法及场景说明:


一、默认值赋值核心语法

语法格式 行为描述 是否修改变量
${VAR:-DEFAULT} VAR 未定义或为空,使用 DEFAULT,否则用 VAR 的值 不修改
${VAR:=DEFAULT} VAR 未定义或为空,将 VAR 设为 DEFAULT,并返回 DEFAULT 修改
${VAR:+REPLACE} VAR 已定义且非空,使用 REPLACE,否则返回空 不修改
${VAR:?ERROR_MSG} VAR 未定义或为空,输出 ERROR_MSG 并终止脚本 不修改

二、典型场景示例

1. 变量默认值赋值(不修改变量)

场景:若 INPUT_PORT 未定义或为空,则使用 8080

output_port= I N P U T P O R T : − 8080 e c h o " {INPUT_PORT:-8080} echo " INPUTPORT:8080echo"output_port" # 输出 INPUT_PORT 或 8080

2. 变量默认值赋值(并修改变量)

场景:若 DB_HOST 未定义或为空,则设置 DB_HOST=localhost

db_connection=“ D B H O S T : = l o c a l h o s t " e c h o " {DB_HOST:=localhost}" echo " DBHOST:=localhost"echo"db_connection” # 输出 DB_HOST 的值(可能已被修改)

3. 条件替换(变量存在时替换)

场景:若 DEBUG_MODE 非空,则替换为 --verbose 参数

args=“ D E B U G M O D E : + − − v e r b o s e " e c h o " {DEBUG_MODE:+--verbose}" echo " DEBUGMODE:+verbose"echo"args” # 输出空或 --verbose

4. 强制变量存在检查

场景:若 API_KEY 未设置,报错退出

api_key=“${API_KEY:?Error: API_KEY must be set}”


三、嵌套用法与复杂场景

1. 链式默认值

优先级:先检查 ENV_CONFIG,若空则检查 DEFAULT_CONFIG,最后用 fallback.conf

config_file=“KaTeX parse error: Expected '}', got 'EOF' at end of input: {ENV_CONFIG:-{DEFAULT_CONFIG:-fallback.conf}}”

2. 带命令替换的默认值

若 CUSTOM_DATE 未设置,使用当前日期

date_to_use=“KaTeX parse error: Expected '}', got 'EOF' at end of input: {CUSTOM_DATE:-(date +%Y-%m-%d)}”

3. 路径拼接默认值

若 LOG_DIR 未设置,使用 /var/log/myapp

log_path=“${LOG_DIR:-/var/log/myapp}/app.log”


四、注意事项

  1. 引号处理
    默认值包含空格时,用双引号包裹避免解析错误:

    message=“${USER_MSG:-“Hello World”}” # 正确

  2. = 赋值的区别

    • VAR=${OTHER:-DEFAULT} → 不修改 OTHER
    • VAR=${OTHER:=DEFAULT} → 修改 OTHER(可能导致副作用)
  3. Shell 兼容性
    上述语法在 bashzshsh 等主流 Shell 中通用。


五、经典错误案例

错误写法

误认为 ${VAR:-DEFAULT} 会修改 VAR 的值

port= V A R : − 8080 e c h o " {VAR:-8080} echo " VAR:8080echo"VAR" # 若 VAR 未定义,此处仍为空

正确修正

使用 ${VAR:=DEFAULT} 赋值并修改 VAR

port= V A R : = 8080 e c h o " {VAR:=8080} echo " VAR:=8080echo"VAR" # 输出 8080(若 VAR 原本未定义)


总结

  • 优先用 ${VAR:-DEFAULT}:安全读取默认值,不修改原变量
  • 谨慎用 ${VAR:=DEFAULT}:会修改原变量,适合初始化配置
  • 多用引号包裹:避免空格或特殊字符导致意外行为
  • 复杂逻辑拆解:嵌套默认值时注意可读性

你可能感兴趣的:(Shell脚本中变量赋值${VAR:-DEFAULT}的用法)