在变量代换的bash冒号操作?(Bash colon operator in variable su

2019-07-20 17:49发布

我继承了一些bash的代码和这两条线扑朔迷离我:

branch_name=`git describe --contains --all HEAD`
branch_name=${branch_name:-HEAD}

我的理解:冒号操作是创建这样使用字符串基于索引的子串, -HEAD在这种情况下,没有任何意义。

Answer 1:

这需要可变branch_name ,如果它被定义。 如果没有定义,使用HEAD来代替。

见壳牌参数扩展的详细信息:

3.5.3壳牌参数扩展

的“$”字符引入参数扩展,命令替换,或算术扩展。 ...参数扩展的基本形式为$ {}参数。
...
当不执行子膨胀,使用如下所述的形式(例如,“: - ”),对于一个参数,其设置或者为空击试验。 省略在测试结肠结果只有一个参数没有设置。 换句话说,如果结肠被包含,两个参数的存在以及其值不为空操作测试; 如果省略了结肠,操作者只对存在测试。

$ {参数:-word}

如果参数是设置或者为空,扩张word被替换。 否则,值parameter被替换。


子在下面涵盖了几行。 两者之间的区别是

${parameter:-word}

VS

${parameter:offset}
${parameter:offset:length}

$ {参数:偏移}
$ {参数:偏移量:长度}

这被称为子串扩展。 它扩展为开始在由偏移所指定的字符参数的值高达长度字符。
...
如果offset计算结果为数字小于零,则该值被用作从参数的值的端部中的字符的偏移。 ... 注意负偏移必须由至少一个空间被从结肠分开,以避免混淆与“: - ”扩张。



Answer 2:

在这种情况下,结肠是只为一个修改器-运营商。 ${branch-HEAD}将扩展为“HEAD”,只在branch没有设置,而${branch:-HEAD}扩展为“HEAD”如果branch是空字符串也是如此。

$ branch=master
$ echo "${branch-HEAD} + ${branch:-HEAD}"
master + master
$ branch=""
$ echo "${branch-HEAD} + ${branch:-HEAD}"
 + HEAD
$ unset branch
$ echo "${branch-HEAD} + ${branch:-HEAD}"
HEAD + HEAD


Answer 3:

在bash中, ${VAR1:-VAR2}相当于SQL的coalesce(VAR1, VAR2)或者C#的VAR1 ?? VAR2 VAR1 ?? VAR2

你的情况:

branch_name=`git describe --contains --all HEAD`
branch_name=${branch_name:-HEAD}

第一行执行git命令并设定在所述值branch_name变量,那么,第二行它的聚结值分配的值HEAD如果branch_name为空。

至于你说的${VAR1:NUM}是一个字符串前缀操作( left在SQL),这与负数时,作为${VAR1: -NUMBER}变成后缀( right )操作。 注意减号前的空格:如果你跳过空格就变成了coalesce正如我以前所说的操作。



文章来源: Bash colon operator in variable substitution?