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