私は読んだ「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"
説明する:
*/
最初から一致する最も長い文字列は次のとおりです。/home/digby/
/*
最後に一致する最も短い文字列は次のとおりです。/myfile.txt
- 最後に.*と一致する最も短い文字列は次のとおりです。
.txt
at the front is
"*.myfile.` と一致する最も長い文字列