このワイルドカード表現はどのように/なぜ動作しますか?

このワイルドカード表現はどのように/なぜ動作しますか?

私のBashスクリプトの1つからコロンで区切られた文字列の最後の部分を取得する必要があります。たとえば、次のよう289283に数値を取得する必要があります。

OK: DriveC-ReadBytesPerSec: 289283

いくつかの試行錯誤の後、私は次の結論に達しました。

READRESULT="OK: DriveC-ReadBytesPerSec: 289283"
echo ${READRESULT#*:*:*}

どの出力289283

問題は、タスクの実行中になぜ${READRESULT#*:*:*}正しい結果が出るのかを完全に理解できないことです。

このワイルドカード表現がどのように機能するかを説明できる人はいますか?

答え1

からman bash

${パラメータ#単語}
${パラメータ##単語}

一致するプレフィックスパターンを削除します。パス名拡張と同様に、単語を拡張してパターンを生成します。パターンがパラメータ値の先頭に一致する場合、拡張結果は、最短一致パターン(case #)または最長一致パターン(##case)が削除されたパラメータの拡張値です。

あなたのパターンは*:*:*であり、bash最も短い一致プレフィックスを削除しようとします。

  • OK:1位のため*:
  • DriveC-ReadBytesPerSec:第二*:
  • 最後の項目は*最短の一致に対して機能するため、何もありません。

比較する:

$ # shortest match without surplus *
$ echo ${READRESULT#*:*:}
289283
$ # going for longest match now; the last * will swallow the number
$ echo ${READRESULT##*:*:*}

$ # longest match without the last *
$ echo ${READRESULT##*:*:}
289283
$ # no need to repeat *: because * matches everything before the last : anyway
$ echo ${READRESULT##*:}
289283

関連情報