我继承了一些bash的代码和这两条线扑朔迷离我:
branch_name=`git describe --contains --all HEAD`
branch_name=${branch_name:-HEAD}
我的理解:
冒号操作是创建这样使用字符串基于索引的子串, -HEAD
在这种情况下,没有任何意义。
我继承了一些bash的代码和这两条线扑朔迷离我:
branch_name=`git describe --contains --all HEAD`
branch_name=${branch_name:-HEAD}
我的理解:
冒号操作是创建这样使用字符串基于索引的子串, -HEAD
在这种情况下,没有任何意义。
这需要可变branch_name
,如果它被定义。 如果没有定义,使用HEAD
来代替。
见壳牌参数扩展的详细信息:
3.5.3壳牌参数扩展
的“$”字符引入参数扩展,命令替换,或算术扩展。 ...参数扩展的基本形式为$ {}参数。
...
当不执行子膨胀,使用如下所述的形式(例如,“: - ”),对于一个参数,其设置或者为空击试验。 省略在测试结肠结果只有一个参数没有设置。 换句话说,如果结肠被包含,两个参数的存在以及其值不为空操作测试; 如果省略了结肠,操作者只对存在测试。$ {参数:-word}
如果参数是设置或者为空,扩张
word
被替换。 否则,值parameter
被替换。
子在下面涵盖了几行。 两者之间的区别是
${parameter:-word}
VS
${parameter:offset}
${parameter:offset:length}
$ {参数:偏移}
$ {参数:偏移量:长度}这被称为子串扩展。 它扩展为开始在由偏移所指定的字符参数的值高达长度字符。
...
如果offset计算结果为数字小于零,则该值被用作从参数的值的端部中的字符的偏移。 ... 注意负偏移必须由至少一个空间被从结肠分开,以避免混淆与“: - ”扩张。
在这种情况下,结肠是只为一个修改器-
运营商。 ${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
在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
正如我以前所说的操作。