web-dev-qa-db-ja.com

変数置換でコロン演算子をバッシュしますか?

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

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

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

28

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

34
Olaf Dietsche

この場合、コロンは-演算子の修飾子にすぎません。 ${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
15
chepner

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演算になります。

6
ruizpauker