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

+ 和 - 号

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}"
相关推荐
dingdingfish18 小时前
GNU Parallel 学习 - 第1章:How to read this book
bash·shell·gnu·parallel
似霰4 天前
Linux Shell 脚本编程——核心基础语法
linux·shell
似霰4 天前
Linux Shell 脚本编程——脚本自动化基础
linux·自动化·shell
偷学技术的梁胖胖yo5 天前
Shell脚本中连接数据库查询数据报错 “No such file or directory“以及函数传参数组
linux·mysql·shell
纵有疾風起14 天前
【Linux 系统开发】基础开发工具详解:软件包管理器、编辑器。编译器开发实战
linux·服务器·开发语言·经验分享·bash·shell
gis分享者16 天前
Shell 脚本中如何使用 here document 实现多行文本输入? (中等)
shell·脚本·document·多行·文本输入·here
柏木乃一16 天前
基础IO(上)
linux·服务器·c语言·c++·shell
angushine17 天前
CPU脚本并远程部署
shell
赵民勇21 天前
Linux/Unix中install命令全面用法解析
linux·shell
gis分享者22 天前
Shell 脚本中如何使用 trap 命令捕捉和处理信号(中等)
shell·脚本·信号·处理·trap·捕捉