总结:整理不易,如果对你有帮助,可否点赞关注一下?
更多详细内容请参考: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运维实战总结