私はいくつかのbashコードを継承しましたが、次の2行は私を困惑させています。
branch_name=`git describe --contains --all HEAD`
branch_name=${branch_name:-HEAD}
:
コロン演算子についての私の理解は、インデックスに基づいて部分文字列を作成するため、文字列-HEAD
を使用しても意味がありません。
変数branch_name
が定義されている場合は、これが使用されます。定義されていない場合は、代わりにHEAD
を使用してください。
詳細は Shell Parameter Expansion を参照してください:
3.5.3シェルパラメータの展開
「$」文字は、パラメーター展開、コマンド置換、または算術展開を導入します。 ...パラメータ展開の基本的な形式は$ {parameter}です。
...
サブストリング拡張を実行しない場合、以下で説明する形式( ‘:-’など)を使用して、Bashは未設定またはnullのパラメーターをテストします。コロンを省略すると、設定されていないパラメーターのみがテストされます。言い換えると、コロンが含まれている場合、演算子は両方のパラメータの存在と、その値がnullではないことをテストします。コロンが省略されている場合、オペレーターは存在のみをテストします。$ {parameter:-Word}
パラメータが設定されていないかnullの場合、
Word
の展開が置換されます。それ以外の場合は、parameter
の値が置換されます。
部分文字列は、以下の数行でカバーされています。 2つの違いは
${parameter:-Word}
対
${parameter:offset}
${parameter:offset:length}
$ {parameter:offset}
$ {parameter:offset:length}これは、サブストリング拡張と呼ばれます。これは、offsetで指定された文字で始まるパラメーターの値の最大長の文字まで拡張されます。
...
offsetが0未満の数値に評価される場合、値はパラメーターの値の末尾からの文字単位のオフセットとして使用されます。 ...「:-」展開と混同しないように、負のオフセットは少なくとも1つのスペースでコロンから区切る必要があることに注意してください。
この場合、コロンは-
演算子の修飾子にすぎません。 ${branch-HEAD}
は、branch
が設定されていない場合にのみ「HEAD」に展開されますが、branch
もnull文字列の場合、${branch:-HEAD}
は「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
Bashでは、_${VAR1:-VAR2}
_はSQLのcoalesce(VAR1, VAR2)
、またはC#の_VAR1 ?? VAR2
_と同等です。
あなたの場合:
_branch_name=`git describe --contains --all HEAD`
branch_name=${branch_name:-HEAD}
_
最初の行はgit
コマンドを実行して_branch_name
_変数に値を設定し、2番目の行はその値を結合して_branch_name
_がnullの場合にHEAD
の値を割り当てます。
あなたが言ったように、_${VAR1:NUM}
_は文字列の接頭辞演算(SQLではleft
)であり、負の数とともに使用すると、_${VAR1: -NUMBER}
_が接尾辞(right
)演算になります。マイナス記号の前の空白に注意してください。その空白をスキップすると、前に述べたようにcoalesce
演算になります。