foo=/tmp/my.dir/filename.tar.gz 

We can use these expressions: 

path = ${foo%/*} 

To get: /tmp/my.dir (like dirname) 

file = ${foo##*/} 

To get: filename.tar.gz (like basename) 

base = ${file%%.*} 

To get: filename 

ext = ${file#*.} 

To get: tar.gz 

Note that the last two depend on the assignment made in the second one 

Here we notice two different "operators" being used inside the parameters (curly braces). Those are the # and the % operators. We also see them used as single characters and in pairs. This gives us four combinations for trimming patterns off the beginning or end of a string: 

${variable%pattern} 

Trim the shortest match from the end 

${variable##pattern} 

Trim the longest match from the beginning 

${variable%%pattern} 

Trim the longest match from the end 

${variable#pattern} 

Trim the shortest match from the beginning