次のように、最初の文字から文字列の最後まで-
すべての項目を削除してパラメータ置換を実行しようとしています。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%%-*}