变量赋值中 + 号 - 号 = 号的用法

+ 和 - 号

1.赋值:

复制代码
name=peiqi
echo "$name"
  • name=peiqi 是一个变量赋值,将字符串 peiqi 赋值给变量 name。
  • echo "$name" 用来输出变量 name 的值。

输出:

复制代码
peiqi

2.未定义变量的默认值 :

在 Bash 中,${var:-default} 和 ${var:+replacement} 是两种常用的变量扩展操作。

${var:-default} 和 ${var-default}`

  • ${var:-default}:如果变量 var 未设置或为空,则使用 default 作为默认值。
  • ${var-default}:与上面的差不多,但它仅在变量未设置的情况下使用默认值,而在变量为空字符串时不会使用默认值。

示例:

复制代码
name=
echo "${name:-peiqi}"  # 输出 "peiqi",因为 name 变量为空
echo "${name-abc}"  # 输出 ""(空),因为 name 变量虽然为空但已设置

输出:

复制代码
peiqi
abc

${var:+replacement} 和 ${var+replacement}`

  • ${var:+replacement}:如果变量 var 被设置,则使用 replacement 替换变量的值。如果变量 var 未设置,则返回空字符串。
  • ${var+replacement}:与${var:+replacement} 类似,只不过它作用更简洁,直接设置替换值。

示例:

复制代码
name=peiqi
echo "${name:+hello}"  # 输出 "hello",因为 name 变量已设置
echo "${name+world}"  # 输出 "world",因为 name 变量已设置

unset name  # 删除 name 变量的设置
echo "${name:+hello}"  # 输出 ""(空),因为 name 变量未设置
echo "${name+world}"  # 输出 ""(空),因为 name 变量未设置

输出:

复制代码
hello
world

总结

在 Bash 脚本中:

  • - 号常用于变量未设置或为空时使用默认值。
  • + 号常用于变量已设置时替换为特定值。

= 号

1.变量被定义的情况下

bash 复制代码
name=peiqi
echo ${name:=app}  # 输出:peiqi
echo $name  # 输出:peiqi,验证变量 value 未改变

2.变量未定义的情况:

复制代码
    unset name  # 确保变量 name 未设置
    echo ${name:=app}  # 输出:app,因为 name 未被设置,呢么将其设置为 app
    echo $name  # 输出:app,变量 name 现在被设置为 app

3.变量为空的情况:

复制代码
    name=""
    echo ${name:=app}  # 输出:app,因为 name 为空,呢么将其设置为 app
    echo $name  # 输出:app,真正的将变量 name 设置为 app

结论:

  • ${var:=value} 语法在 Bash 中用于当 var 变量未设置或为空时,将其设置为 value,并返回 value。
  • 如果 var 已经被设置且有值,则直接返回该变量的值,而不修改其内容。

:- 和 := 用法详细区别

:= 用法

${var:=value} 语法用于当 var 变量未设置或为空时,将其设置为 value,同时返回 value。如果 var 已经被设置且有值,则直接返回该变量的值,而不修改其内容。

例子:

复制代码
# 变量未定义
unset name
echo ${name:=app}  # 输出:app,并将 name 设置为 app
echo $name  # 输出:app,因为 name 已被设置为 app

# 变量为空
name=""
echo ${name:=app}  # 输出:app,并将 name 设置为 app
echo $name  # 输出:app

# 变量已有值
name="peiqi"
echo ${name:=app}  # 输出:peiqi,name 保持不变
echo $name  # 输出:peiqi
:- 用法

${var:-value} 语法用于当 var 变量未设置或为空时,返回 value,但不对 var 进行任何修改。如果 var 已经被设置且有值,则直接返回该变量的值。

例子:

复制代码
# 变量未定义
unset name
echo ${name:-app}  # 输出:app,但不修改 name
echo $name  # 输出为空行,因为 name 未被设置

# 变量为空
name=""
echo ${name:-app}  # 输出:app,但不修改 name
echo $name  # 输出:空行,因为 name 没有被修改

# 变量已有值
name="peiqi"
echo ${name:-app}  # 输出:peiqi,name 保持不变
echo $name  # 输出:peiqi

详尽总结

  • :=(变量设置并返回):

    • 如果变量未设置或为空,它将变量设置为指定的值,并且返回这个值。
    • 如果变量已被设置并有值,它什么都不做,仅返回这个变量的值。
  • :-(变量替代返回):

    • 如果变量未设置或为空,它返回指定的值,但不会对变量进行任何修改。
    • 如果变量已被设置并有值,它直接返回这个变量的值,不做修改。

比较图表

表达式 变量未设置结果 变量为空结果 变量有值结果
${var:=v} 返回v,设置var=v 返回v,设置var=v 返回var,不修改
${var:-v} 返回v,不修改 返回v,不修改 返回var,不修改

实际应用例子

使用 := 的场景:

提供一个默认值,并确保变量在后续使用中是有意义的。

复制代码
# 确保变量有值,用于配置文件路径
config_file=${CONFIG_FILE:=/etc/default/config}
echo "Config file path is $config_file"

使用 :- 的场景:

仅提供临时的默认值,不改变全局变量状态。

复制代码
# 安全提示用户路径,但不改动实际变量
echo "Config file path is ${CONFIG_FILE:-/etc/default/config}"
相关推荐
AnxiangLemon6 天前
Warp Lite :一个专注本地使用的开源终端
终端·shell·warp·warp lite
sbjdhjd9 天前
从污点追踪断点到 PHP-FPM 请求队列:HIDS PHP WebShell 样本复盘
开发语言·网络安全·数据挖掘·渗透测试·开源·php·shell
Shell运维手记12 天前
Shell 结构化命令知识点总结(case、for、while)
运维·microsoft·shell·脚本
云计算练习生12 天前
什么是 Bash?Linux 默认 Shell 的核心功能
linux·操作系统·bash·shell·命令解释器
猫咪很可爱13 天前
MySQL 5.7 备份恢复后函数与存储过程丢失:原因分析与正确备份姿势
数据库·mysql·bug·shell
qetfw14 天前
Linux 文件清理:find、mtime 与安全传参验证
linux·shell·1024程序员节
Lsetea16 天前
curl下载HTTPS文件报23:证书验证成功与本地写入失败分层排查
linux·https·shell·ssl证书·curl
DogDaoDao17 天前
Windows 双 Shell 全面对比:CMD 与 PowerShell 的技术剖析
windows·shell·测试·powershell·cmd·程序员开发
Lsetea18 天前
OpenSSL的checkhost显示不匹配却退出0:名称检查与证书验收
linux·https·shell·ssl证书·openssl
钱栈up21 天前
耳机音效不对,我顺手查了系统更新,结果挖出个崩溃了整天的服务
windows·shell