Reputation: 8836
I was reviewing some of my old code and came across this syntax:
extractDir="${downloadFileName%.*}-tmp"
The only information I found searching refers to a list of commands, but this is just one variable. What does this curly-brace syntax mean in bash?
Upvotes: 30
Views: 20417
Reputation: 754490
In this context, it is a parameter substitution.
The ${variable%.*}
notation means take the value of $variable
, strip off the pattern .*
from the tail of the value — mnemonic: percenT has a 't' at the Tail — and give the result. (By contrast, ${variable#xyz}
means remove xyz
from the head of the variable's value — mnemonic: a Hash has an 'h' at the Head.)
Given:
downloadFileName=abc.tar.gz
evaluating extractDir="${downloadFileName%.*}-tmp"
yields the equivalent of:
extractDir="abc.tar-tmp"
The alternative notation with the double %
:
extractDir="${downloadFileName%%.*}-tmp"
would yield the equivalent of:
extractDir="abc-tmp"
The %%
means remove the longest possible tail; correspondingly, ##
means remove the longest matching head.
Upvotes: 71
Reputation: 617
It is used when expanding an environment variable adjacent to some text that is not the variable, so the shell does not include all of it in the variable name.
Upvotes: -1
Reputation: 799082
It indicates that parameter expansion will occur.
Upvotes: 5