2009-02-11 8 views
9

Ich habe einen Teil eines Bash-Skripts, das einen Dateinamen ohne Erweiterung bekommt, aber ich versuche zu verstehen, was hier wirklich passiert. Wofür sind die %%? Kann jemand näher erläutern, was hinter den Kulissen passiert? Wie kann diese Technik allgemein angewendet werden?Verwendet für diese bash Dateiname Extraktionstechnik?

#!/bin/bash 

for src in *.tif 
    do 
    txt=${src%%.*} 
    tesseract ${src} ${txt} 
    done 
+1

Beachten Sie, dass %% alle '.' im Dateinamen, nicht nur die so genannte Erweiterung. Zum Beispiel hätten Sie, wenn Sie hello.world.tif und hello.death.tif hatten, beide an dasselbe Ziel gesendet, hallo. Wenn Sie nur eine Erweiterung entfernen möchten, verwenden Sie%. – johnny

+0

Da bei mehreren "." S im Dateinamen gesucht werden soll und das "kürzeste passende Muster" von der rechten Seite des Strings entfernt werden soll. Für mich ergibt das Sinn. Im Fall meines obigen Skripts sollte ich es in "%" ändern. Dies soll Dateinamenerweiterungen entfernen. – jjclarkson

Antwort

15

Es wird von der Dateinamenerweiterung zu befreien (hier: .tif), Beispiel:

$ 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 

von bash Handbuch:

${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. 
+1

Aus Ihrem Beispiel kann ich sehen, wie mächtig Bash von der Kommandozeile aus sein kann. Vielen Dank! – jjclarkson

1

Check out "Parametererweiterung" in den bash man pages. Diese Syntax erweitert die $ src-Variable zum Löschen von Inhalten, die mit dem. * -Muster übereinstimmen.

+0

Danke, mir war nicht klar, dass die Bash Man Seiten so umfangreich waren. – jjclarkson

4

Hier Ausgabe von der Seite bash man

${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. 
1

Es ist eine Zeichenfolge Entfernung in der für mat: ${str%%substr}

Wobei str die Zeichenkette ist, auf der Sie arbeiten, und substr ist das Muster, zu dem es passt. Es sucht nach der längsten Übereinstimmung von substr in str und entfernt alles von diesem Punkt an.

3

Offenbar hat bash mehrere "Parameter Expansion" Tools, die umfassen:

einfach den Wert ersetzen ...

${parameter} 

Erweiterung auf eine Unterkette ...

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

Ersetzen Sie die Länge des Parameters Wert ...

${#parameter} 

bei einer Übereinstimmung Erweiterung am Anfang des Parameters ...

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

Erweiterung auf einem Spiel am Ende des Parameters ...

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

erweitert um die Parameter zu finden und ersetzen Sie eine Zeichenkette ...

${parameter/pattern/string} 

Dies sind meine Interpretation der Teile, die ich denke, dass ich verstehe von diesem Abschnitt der man-Seiten. Lass mich wissen, wenn ich etwas Wichtiges verpasst habe.

+0

Es ist nur ein kleiner Unterschied zwischen # und ## und% und %%. Diese Erweiterungen verstehen auch Dateinamen nicht. – johnny