$ {0 ## * /}と$ {0%/ *}はどのように機能しますか?


33

シェルスクリプトで見つけた次の正規表現についてかなり混乱しています。

${0##*/}
${0%/*}

彼らはどのように機能しますか?

回答:


38

これらは正規表現ではなく、Bashのパラメーター拡張の例です。変数またはその値による特別なパラメーターの置換です。Wooledge Wikiには良い説明があります。

基本的に、あなたが持っている例では、次のように${0##*/}翻訳します:

変数$ 0およびパターン '/'の場合、2つのハッシュはパラメーターの先頭から意味し、パターンまでの最長(または貪欲な)一致を削除します。

したがって、$0ファイルの名前(例:)は$HOME/documents/doc.txt、次のようにパラメーターが展開されます。doc.txt

同様に、の${0%/*}場合、パターン/はパラメーターの終わり%)に一致し、最短または貪欲でない一致が削除されます-上記の例ではが表示されます$HOME/documents

Bash Hacker's Wikiの記事も参照してください。


2
だから...彼らは使いたくなかったしbasenamedirname?:D
アーロンD.マラスコ

8
一つの利点は、サブプロセスを起動しないパラメータsusbstitution ...である
jasonwryan

@jasonwryan、上記の2つの例の*の機能について詳しく説明してください。または、そこに*を配置する必要がある理由。具体的には、最初の例では、*は//の前に配置されます。2番目の例では、/の後に*が配置されます。根本的な違いは何ですか?ありがとう。
user785099

3
glob(*)は、パターンを含むすべてのパターンが削除されることを示します。したがって、パラメータの開始時は#、それは左側にあり、終了時は%、右側から逆に機能します。
jasonwryan

5
これはbash固有ではなく、POSIXで指定されていshます。
nyuszika7h 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.