2012-03-04 19 views
12

私は私の古いコードのいくつかを検討し、この構文に出くわした、私はそれが私が検索を見つけ

extractDir="${downloadFileName%.*}-tmp" 

唯一の情報は、コマンドのリストを意味するが、これは単なるです:-)意味を正確に何を忘れます1つの変数。 この中括弧構文がbashで意味することは何ですか?

+3

* [BASHリファレンスマニュアル](http://www.gnu.org/software/bash/manual/bashref.html)から始めます。[パラメータの拡張](http: /www.gnu.org/software/bash/manual/bashref.html#Shell-パラメータ - 展開)。 (中括弧は、* $記号の前に*がないときは何かを意味します) –

答えて

20

この文脈では、parameter substitutionです。

${variable%.*}手段は$variableの値をとる、(ニーモニック:%は末尾に「T」を有する)値の尾からパターン.*を取り除き、そして結果を与えます。 (対照的に、${variable#xyz}は(ニーモニック)ハッシュ先頭に「H」を有しているため、変数の値の先頭からxyzを除去することを意味する。)を考える

downloadFileName=abc.tar.gz 
extractDir=abc.tar-tmp 

代替表記:

extractDir=${downloadFileName%%.*} 

利回り

abc-tmp 

%%は可能な限り長いテールを削除することを意味します。それに対応して、##は最も長いマッチングヘッドを除去することを意味します。

+0

徹底的な回答ありがとうございます! –

+0

@Shane:本当ですか?バッシュで? Mac OS X 10.10のほぼ完全にパッチを適用した私のBash 4.3(4.3.27(2))はそれを好きではない: 'downloadFileName = abc.tar.gz; echo $ {$ {downloadFileName#abc。}%。gz} 'は' bash-4.3:$ {$ {downloadFileName#abc。}%。gz}を生成します。どのプラットフォームとBashのバージョンを指定できますか? –

+0

Zsh(**ではBash **ではない)では、これらも入れ子にすることができます(つまり$ {$ {downloadFilename#abc}} .gz}は "tar"を生成します)。捕まえてくれてありがとう@JonathanLeffler。 – Shane

5

これは、parameter expansionが発生することを示します。

+0

ありがとうございました! –

0

変数ではないテキストに隣接する環境変数を展開するときに使用されるため、シェルは変数名のすべてにシェルを含めません。

関連する問題