Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Uses for this bash filename extraction technique?

I have a portion of a bash script that is getting a filename without extension, but I'm trying to understand what is really going on here. What are the "%%"'s for? Can someone elaborate on what bash is doing behind the scenes? How can this technique be used on a general basis?

#!/bin/bash

for src in *.tif
    do
    txt=${src%%.*}
    tesseract ${src} ${txt}
    done
like image 304
jjclarkson Avatar asked Feb 11 '09 19:02

jjclarkson


3 Answers

It gets rid of the filename extension (here: .tif), sample:

$ for A in test.py test.sh test.xml test.xsl; do echo "$A: ${A%%.*}"; done
test.py: test
test.sh: test
test.xml: test
test.xsl: test

from bash manual:

   ${parameter%%word}
          The word is expanded to produce a pattern just as in pathname expansion.  If the
          pattern matches a trailing portion of the expanded value of parameter, then  the
          result  of  the  expansion  is the expanded 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.
like image 144
Johannes Weiss Avatar answered Nov 19 '22 11:11

Johannes Weiss


Here's output from the bash man page

 ${parameter%%word}
          The word is expanded to produce a pattern just  as  in  pathname
          expansion.   If  the  pattern  matches a trailing portion of the
          expanded value of parameter, then the result of the expansion is
          the  expanded value of parameter with the shortest matching pat-
          tern (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.
like image 32
Steve Lazaridis Avatar answered Nov 19 '22 12:11

Steve Lazaridis


Apparently bash has several "Parameter Expansion" tools which include:

Simply substituting the value...

${parameter}

Expanding to a sub-string...

${parameter:offset}
${parameter:offset:length}

Substitute the length of the parameters value...

${#parameter}

Expanding upon a match at the beginning of the parameter...

${parameter#word}
${parameter##word}

Expanding upon a match at the end of the parameter...

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

Expands the parameter to find and replace a string...

${parameter/pattern/string}

These are my interpretation of the parts I think I understand from this section of the man pages. Let me know if I missed something important.

like image 3
jjclarkson Avatar answered Nov 19 '22 11:11

jjclarkson