Gar*_*ord 28 string variables bash colon variable-substitution
我继承了一些bash代码,这两行让我感到困惑:
branch_name=`git describe --contains --all HEAD`
branch_name=${branch_name:-HEAD}
Run Code Online (Sandbox Code Playgroud)
我对:冒号运算符的理解是基于索引创建子串,因此-HEAD在这种情况下使用字符串没有任何意义.
Ola*_*che 34
branch_name如果定义了变量,则接受该变量.如果未定义,请HEAD改用.
有关详细信息,请参见Shell参数扩展:
3.5.3 Shell参数扩展
'$'字符引入了参数扩展,命令替换或算术扩展....参数扩展的基本形式是$ {parameter}.
...
当不执行子串扩展时,使用下面描述的形式(例如,': - '),Bash测试未设置或为null的参数.省略冒号只会导致对未设置的参数进行测试.换句话说,如果包含冒号,运算符将测试参数的存在性及其值不为空; 如果省略冒号,则运算符仅测试是否存在.$ {参数:-word}
如果参数未设置或为null,
word则替换扩展.否则,值parameter被替换.
子串包括在下面几行.两者的区别在于
${parameter:-word}
Run Code Online (Sandbox Code Playgroud)
VS
${parameter:offset}
${parameter:offset:length}
Run Code Online (Sandbox Code Playgroud)
$ {parameter:offset}
$ {parameter:offset:length}这称为子串扩展.它扩展为从offset指定的字符开始的参数值的最大长度字符.
...
如果offset的计算结果小于零,则该值将用作参数值末尾的字符偏移量.... 请注意,负偏移必须与冒号分隔至少一个空格,以避免与': - '扩展混淆.
che*_*ner 15
在这种情况下,冒号只是-运算符的修饰符.${branch-HEAD}只有在branch未设置时才会扩展为"HEAD" ,而${branch:-HEAD}如果branch是空字符串则扩展为"HEAD" .
$ 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
Run Code Online (Sandbox Code Playgroud)
在bash中,${VAR1:-VAR2}等同于SQL coalesce(VAR1, VAR2)或C#VAR1 ?? VAR2.
在你的情况下:
branch_name=`git describe --contains --all HEAD`
branch_name=${branch_name:-HEAD}
Run Code Online (Sandbox Code Playgroud)
第一行执行git命令并设置branch_name变量中的值,然后,第二行合并其值,赋值HEADif branch_name为null.
正如你所说的${VAR1:NUM}是一个字符串前缀操作(left在SQL中),当与负数一起使用时,${VAR1: -NUMBER}变为后缀(right)操作.注意减号之前的空白:如果你跳过那个空格,那就变成了coalesce我之前说过的操作.