45

私はいくつかの bash コードを継承しましたが、次の 2 行に当惑しています。

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

コロン演算子についての私の理解では:、インデックスに基づいて部分文字列を作成するため-HEAD、この場合、文字列を使用しても意味がありません。

4

3 に答える 3

52

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 つのスペースでコロンと区切る必要があることに注意してください。

于 2013-02-28T19:20:14.290 に答える
21

-この場合、コロンは演算子の単なる修飾子です。が設定されてい${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
于 2013-02-28T20:12:10.223 に答える
6

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に割り当てます。HEADbranch_name

あなたが言っ${VAR1:NUM}たように、文字列プレフィックス操作(leftSQLの場合)は、負の数で使用する${VAR1: -NUMBER}と、サフィックス(right)操作になります。マイナス記号の前の空白に注意してください。その空白をスキップすると、coalesce前に述べたように操作になります。

于 2013-02-28T19:37:30.520 に答える