Bashのパラメータ拡張は一致をどのように評価しますか?

Bashのパラメータ拡張は一致をどのように評価しますか?

私は読んだ「Linux聖書10版」第7章:簡単なシェルスクリプトの作成、149ページ、 「Bashのパラメータ拡張」の段落。

  • ${var:-value}- 変数が設定されていないか空の場合は値に展開します。
  • ${var#pattern}- var 値の先頭で最も短いパターンマッチングを切り捨てます。
  • ${var##pattern}- var 値の先頭から最長のパターンマッチを取得します。
  • ${var%pattern}- var値の終わりで最も短いパターンマッチングを切り捨てます。
  • ${var%%pattern}- var 値の終わりで最も長いパターンマッチングを切り捨てます。

どう説明してください。最も長い/最も短い一致が計算されますか?右から左に、それとも逆ですか?

また、以下のコードの仕組みと出力の計算方法について説明してください。

MYFILENAME=”/home/digby/myfile.txt”—Sets the value of MYFILENAME 
FILE=${MYFILENAME##*/}—FILE becomes "myfile.txt" 
DIR=${MYFILENAME%/*}—DIR becomes "/home/digby" 
NAME=${FILE%.*}—NAME becomes "myfile" 
EXTENSION=${FILE##*.}—EXTENSION becomes "txt"

ありがとうございます。

答え1

正面から切り出した「#」ケースから始めます。たとえば、文字列を文字列(「0個以上の文字」の後にピリオドがあることを意味)と一致させるmyfile.tar.gz場合、2つの一致があります。これ*.myfile.myfile.tar.最短一致する内容は次のとおりです。

${MYFILENAME#*.} # ie myfile.

結果は次のとおりですtar.gz。これ最長一致する内容は次のとおりです。

${MYFILENAME##*.} # ie myfile.tar.

結果は次のとおりですgz

それでは、「%」の場合を考えてみましょう。ここで一致は文字列の右側にあります。今回.*は、後ろに文字がある(またはない)点を探しています。最短一致が.gz最長項目なので、.tar.gz次のような結果が得られます。

${MYFILENAME%.*}  # => myfile.tar
${MYFILENAME%%.*} # => myfile

他の例は、この点を説明するためにテーマを変形したものです。

MYFILENAME=”/home/digby/myfile.txt”—Sets the value of MYFILENAME 
FILE=${MYFILENAME##*/}—FILE becomes "myfile.txt" 
DIR=${MYFILENAME%/*}—DIR becomes "/home/digby" 
NAME=${FILE%.*}—NAME becomes "myfile" 
EXTENSION=${FILE##*.}—EXTENSION becomes "txt"

説明する:

  1. */最初から一致する最も長い文字列は次のとおりです。/home/digby/
  2. /*最後に一致する最も短い文字列は次のとおりです。/myfile.txt
  3. 最後に.*と一致する最も短い文字列は次のとおりです。.txt
  4. at the front is"*.myfile.` と一致する最も長い文字列

関連情報