bash - 花括号中的变量扩展

标签 bash

这是代码

a=''
b=john
c=${a-$b}
echo $c

输出为空行

对于第一个变量未初始化的类似代码

b1=doe
c1=${a1-$b1}
echo $c1

输出是

doe

我不明白 bash 如何处理导致不同结果的变量扩展。

最佳答案

${var-value} 有两种变体符号,一种不带冒号,如图所示,一种带冒号:${var:-value} .

第一个版本没有冒号,意思是“如果$var设置为任何值(包括空字符串),使用它;否则,使用 value相反'。

第二个版本,带冒号,意思是'if $var设置为除空字符串以外的任何值,使用它;否则,使用 value相反'。

此模式也适用于其他变量替换,特别是:

  • ${var:=value}
    • 如果$var设置为任何非空字符串,保持不变;否则,设置 $varvalue .
  • ${var=value}
    • 如果$var设置为任何值(包括空字符串),保持不变;否则,设置 $varvalue .
  • ${var:?message}
    • 如果$var设置为任何非空字符串,什么都不做;否则,使用给定的消息提示(如果 message 本身为空,则提供默认消息)。
  • ${var?message}
    • 如果$var设置为任何值(包括空字符串),什么都不做;否则,使用给定的消息进行投诉。

这些符号都适用于任何 POSIX 兼容的 shell(Bourne、Korn、Bash 等)。您可以找到 bash 的手册在线版本 — 在 Shell Parameter Expansion 部分. Bash 也有许多非标准符号,其中许多非常有用但不一定与其他 shell 共享。

关于bash - 花括号中的变量扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14152534/

相关文章:

linux - 重命名与目录同名的文件 - bash 脚本

linux bash 脚本 -> 更新远程 mysql 表 -> 错误 [0m

linux - "host1$ ssh host2 cmd1 | cmd2"cmd2 将在哪台主机上运行?

c - 在不编译和执行代码的情况下找到类型大小的最简单方法是什么?

string - 排序列表并将排序后的值添加到 bash 中的新列表

bash - 在 shell 脚本中的管道输出上运行 ls

linux - 如何使用 bash 脚本检查目录中是否存在 git 存储库

linux - 从任何(非特定)目录运行 shell 脚本

bash - git push 后在浏览器中打开 pull 请求的 URL?

bash - 如何在非 Bash Shell 中迭代 Null 分隔结果