《Linux运维总结:Shell脚本高级特性之根据变量状态赋值》

总结:整理不易,如果对你有帮助,可否点赞关注一下?

更多详细内容请参考:Linux运维实战总结


一、语法格式说明

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

二、典型场景示例

2.1、${VAR:-DEFAULT}

示例一:VAR 未定义

# 清理环境(确保变量未定义)
root@k8s-master-58:~# unset VAR
root@k8s-master-58:~# echo "Value is: ${VAR:-default_value}"
Value is: default_value

# 检查 VAR 是否被修改
root@k8s-master-58:~# echo "VAR is still: '$VAR'"
VAR is still: ''

解释:VAR 未定义,所以使用 default_value,但 VAR 本身仍是空。


示例二:VAR 为空字符串

root@k8s-master-58:~# VAR=""
root@k8s-master-58:~# echo "Value is: ${VAR:-default_value}"
Value is: default_value

解释:空字符串也视为“未设置”,所以返回默认值。


示例三:VAR 有值

root@k8s-master-58:~# VAR="hello"
root@k8s-master-58:~# echo "Value is: ${VAR:-default_value}"
Value is: hello

解释:VAR 有值,直接使用原值。


实际用途:提供默认配置

# 设置默认端口
PORT=${PORT:-8080}
echo "Server will run on port $PORT"
# 如果你之前设置了 PORT=3000,则用 3000;否则用 8080

2.2、${VAR:=DEFAULT}

示例一:VAR 未定义 → 被赋值

root@k8s-master-58:~# unset VAR
root@k8s-master-58:~# echo "Value is: ${VAR:=default_value}"
Value is: default_value
root@k8s-master-58:~# echo "VAR is now: '$VAR'"
VAR is now: 'default_value'

解释:空字符串也视为“未设置”,所以返回默认值。


示例二:VAR 为空 → 被赋值

root@k8s-master-58:~# VAR=""
root@k8s-master-58:~# echo "Value is: ${VAR:=default_value}"
Value is: default_value
root@k8s-master-58:~# echo "VAR is now: '$VAR'"
VAR is now: 'default_value'

示例三:VAR 有值 → 不变

root@k8s-master-58:~# VAR="hello"
root@k8s-master-58:~# echo "Value is: ${VAR:=default_value}"
Value is: hello
root@k8s-master-58:~# echo "VAR is still: '$VAR'"
VAR is still: 'hello'

解释:已有值,不修改。


实际用途:初始化配置变量

root@k8s-master-58:~# unset BASE_DIR LOG_DIR
root@k8s-master-58:~# BASE_DIR=/data
root@k8s-master-58:~# BASE_DIR=${BASE_DIR:=/opt/myapp}
root@k8s-master-58:~# echo ${BASE_DIR}
/data
root@k8s-master-58:~# LOG_DIR=${LOG_DIR:=$BASE_DIR/logs}
root@k8s-master-58:~# echo "BASE_DIR: $BASE_DIR" 
BASE_DIR: /data
root@k8s-master-58:~# echo "LOG_DIR: $LOG_DIR"
LOG_DIR: /data/logs

2.3、${VAR:+REPLACE}

示例一:VAR 未定义 → 返回空

root@k8s-master-58:~# unset VAR
root@k8s-master-58:~# echo "Prefix: [${VAR:+has_value}]"
Prefix: []

示例二:VAR 为空 → 返回空

root@k8s-master-58:~# unset VAR
root@k8s-master-58:~# VAR=""
root@k8s-master-58:~# echo "Prefix: [${VAR:+has_value}]"
Prefix: []

示例三:VAR 有值 → 返回 REPLACE

root@k8s-master-58:~# unset VAR
root@k8s-master-58:~# VAR="anything"
root@k8s-master-58:~# echo "Prefix: [${VAR:+123456}]"
Prefix: [123456]

实际用途:条件性添加文本

# 只有在 DEBUG 模式下才输出调试信息
root@k8s-master-58:~# unset DEBUG
root@k8s-master-58:~# DEBUG=1
root@k8s-master-58:~# echo "Starting app${DEBUG:+ (DEBUG MODE)}"
Starting app (DEBUG MODE)

root@k8s-master-58:~# unset DEBUG
root@k8s-master-58:~# DEBUG=""
root@k8s-master-58:~# echo "Starting app${DEBUG:+ (DEBUG MODE)}"
Starting app

2.4、${VAR:?ERROR_MSG}

示例一:VAR 未定义 → 脚本终止

root@k8s-master-58:~# unset VAR
root@k8s-master-58:~# echo "Checking: ${VAR:?VAR is REQUIRED}"
-bash: VAR: VAR is REQUIRED
root@k8s-master-58:~# echo $?
1

示例二:VAR 为空 → 脚本终止

root@k8s-master-58:~# unset VAR
root@k8s-master-58:~# VAR=""
root@k8s-master-58:~# echo "Checking: ${VAR:?Cannot be empty}"
-bash: VAR: Cannot be empty
root@k8s-master-58:~# echo $?
1

示例三:VAR 有值 → 正常输出

root@k8s-master-58:~# unset VAR
root@k8s-master-58:~# VAR="ok"
root@k8s-master-58:~# echo "Checking: ${VAR:?This will not show}"
Checking: ok

实际用途:脚本开头强制检查

#!/bin/bash
# 检查必需环境变量
echo ${API_KEY:?Error: API_KEY is not set. Please export it.}
echo ${DB_HOST:?Error: DB_HOST is not set. Please export it.}
echo ${MODE:?Error: MODE is not set. Please export it.}

#  如果任何变量未设置,脚本会立即报错并退出,如果有正常输出
root@k8s-master-58:~# unset API_KEY && unset DB_HOST && unset MODE
root@k8s-master-58:~# export API_KEY=fdaadk
root@k8s-master-58:~# export DB_HOST=localhost
root@k8s-master-58:~# export MODE=dev
root@k8s-master-58:~# ./a.sh
fdaadk
localhost
dev

总结:整理不易,如果对你有帮助,可否点赞关注一下?

更多详细内容请参考:Linux运维实战总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东城绝神

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值