`${parameter#word}`と `${parameter##word}`の違いは何ですか?

`${parameter#word}`と `${parameter##word}`の違いは何ですか?

によるとman bash

${parameter#word}  
${parameter##word}
    Remove matching prefix pattern. The word is expanded to produce a
    pattern just as in pathname expansion, and matched against the
    expanded value of parameter using the rules described under Pattern
    Matching below. If the pattern matches the beginning of the value of
    parameter, then the result of the expansion is the expanded value of
    parameter with the shortest matching pattern (the ``#'' case) or the
    longest matching pattern (the ``##'' case) deleted. If parameter is
    @ or *, the pattern removal operation is applied to each positional
    parameter in turn, and the expansion is the resultant list.  If
    parameter is an array variable subscripted with @ or *, the pattern
    removal operation is applied to each member of the array in turn,
    and the expansion is the resultant list.

${parameter#word}なぜか他の結果が出てくる状況は見られません${parameter##word}

私は2つの文法間の異なる動作を示す状況を探しています。ところで、何ですか?最短一致パターンそして何ですか?最長一致パターン

答え1

この例では、問題をよりよく説明できます。

$ parameter="This is a sentence with many words. Some of the words appear more than once. Oh, my word!"
$ echo "${parameter#*word}"
s. Some of the words appear more than once. Oh, my word!
$ echo "${parameter##*word}"
!

だから:

  • ${parameter#pattern}削除最短パターンマッチング
  • ${parameter##pattern}削除最長パターンマッチング

似合うパターン${parameter%pattern}もあり${parameter%pattern}終わりひも。#似たように見えたので違いを覚えています。今後 %(アメリカ)キーボードから。

答え2

次の例を見つけました。

$ INT=00011
$ echo "${INT#*0}"
0011
$ echo "${INT##*0}"
11

ここでは、最初に文字列「00011」を変数「INT」に代入し、次に「${parameter#word}INT」をパラメータとして、「* 0」を単語mode orとしてパラメータ拡張結果を出力します。${parameter##word}

これ最小[プレフィックス]一致「* 0」のパラメータは「0」ですが、最大[プレフィックス]一致「000」です。

関連情報