パラメータ置換時に$ atomの正しい使用

パラメータ置換時に$ atomの正しい使用

次のように、最初の文字から文字列の最後まで-すべての項目を削除してパラメータ置換を実行しようとしています。v0.1-bla-hblah-232 -> v0.1

だから、次のスクリプトを使用します。

#!/usr/bin/env bash
project_version=$(git describe --tags --long)
clean_version=${project_version%-$}
echo "$project_version"
echo "$clean_version"

これを実行すると動作しません。

test λ ./revisioncount.sh
v0.1-2-g2ff1e73
v0.1-2-g2ff1e73

$bashが原子を選択していないようです。バックスラッシュも機能しません:\$

これで、代替行を次のように変更した場合:

clean_version=${project_version%%-*}

それはうまくいきます:

test λ ./revisioncount.sh
v0.1-2-g2ff1e73
v0.1

$目的の効果を得るには(文字列の最後の一致)をどのように使用しますか?

答え1

clean_version=${project_version%%-*}

あなたが見つけたように、これは正しい使い方です。

%そして%%マッチ終わり$定義によると、最後に「一致」などのアンカーは必要ありません。

#最初に参照してマッチングするために。##

興味深いケースは、/基本的にどこでも一致する拡張です。ここ最初文字はパターンが開始または終了で一致するように強制します#%

答え2

bashイディオムは${var%%pattern}正規表現ではなくパターンを使用します。

パターンでは、a は目的の.*「すべて」とは異なることを意味します。
実際、simpleは*パターンのすべての文字と一致します。

また、%マッチタイプ(自己特性に応じて)は$

だからこれ:

echo ${project_version%%-*}

最も長い一致と一致します(ダッシュ()では%%なく、その後に内部文字列の終わりまでのすべての文字が続きます)。%-project_version

これで正しい割り当ては次のようになります。

clean_version=${project_version%%-*}

関連情報