-1

I'm trying to understand what the expression, f2=${f%????} means in a bash script.

I tried searching the web for some reference, but no luck finding something useful.

The code I'm using is:

for f in "$@"
do
f2=${f%????}
/usr/bin/openssl smime -in "$f" -verify -inform DER -noverify -out "$f2"
done
Cyrus
  • 84,225
  • 14
  • 89
  • 153
lgheorghe
  • 3
  • 3
  • Have you read [the Bash manual page](http://man7.org/linux/man-pages/man1/bash.1.html)? Especially the [EXPANSION](http://man7.org/linux/man-pages/man1/bash.1.html#EXPANSION) section. – Some programmer dude Aug 15 '19 at 10:55

1 Answers1

1

That's documented in the bash manual under Shell Parameter Expansion:

${parameter%word}
${parameter%%word}

The word is expanded to produce a pattern and matched according to the rules described below (see Pattern Matching). If the pattern matches a trailing portion of the expanded value of parameter, then the result of the expansion is the value of parameter with the shortest matching pattern (the % case) or the longest matching pattern (the %% case) deleted. If parameter is @ or *, the pattern removal operation is applied to each positional parameter in turn, and the expansion is the resultant list. If parameter is an array variable subscripted with @ or *, the pattern removal operation is applied to each member of the array in turn, and the expansion is the resultant list.

In other words, ${f%????} is the value of $f with the four last characters deleted.

You could also write ${f:0:-4}, which is perhaps a bit clearer.

Community
  • 1
  • 1
melpomene
  • 84,125
  • 8
  • 85
  • 148
  • 1
    `${f%????}` is standard though. It's likely that the intent, though, is to remove a 3-letter extension and the `.` from the file name, in which case something more specific like `${f%.???}` would be preferable. – chepner Aug 15 '19 at 12:03
  • Thank you for your answers and comments. They have been very useful. – lgheorghe Aug 15 '19 at 13:29