2009-02-11 8 views
9

J'ai une partie d'un script bash qui obtient un nom de fichier sans extension, mais j'essaie de comprendre ce qui se passe vraiment ici. A quoi servent les "%%"? Quelqu'un peut-il élaborer sur ce que bash fait dans les coulisses? Comment cette technique peut-elle être utilisée de manière générale?Utilise cette technique d'extraction de nom de fichier bash?

#!/bin/bash 

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

Notez que %% supprimera tous les '.' dans le nom de fichier, pas seulement la soi-disant extension. Par exemple si vous aviez hello.world.tif et hello.death.tif, les deux auraient tesseract les envoyer à la même destination, bonjour. Si vous voulez supprimer seulement une extension, utilisez%. – johnny

+0

Parce que dans le cas de plusieurs "." S dans le nom de fichier que vous souhaitez rechercher et dépouiller le "motif le plus court correspondant" du côté droit de la chaîne. Cela a du sens pour moi. Donc, dans le cas de mon script ci-dessus, je devrais le changer en "%". Ceci est censé dépouiller les extensions de nom de fichier. – jjclarkson

Répondre

15

Il se débarrasse de l'extension de nom de fichier (ici: .tif), échantillon:

$ 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 

du manuel bash:

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

De votre exemple, je peux commencer à voir comment bash puissant peut être juste à partir de la ligne de commande. Merci! – jjclarkson

1

Consultez la section «Extension des paramètres» dans les pages de manuel bash. Cette syntaxe étend la variable $ src en supprimant tout ce qui correspond au modèle. *.

+0

Merci, je ne savais pas que les pages de manuel de bash étaient si étendues. – jjclarkson

4

Voici la sortie de l'homme bash la 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. 
1

C'est une opération d'enlèvement de chaîne dans le pour mat: ${str%%substr}

Où str est la chaîne que vous opérez, et substr est le modèle de match. Il cherche la plus longue correspondance de substr dans str, et supprime tout à partir de ce point.

3

Apparemment bash a plusieurs outils "extension des paramètres" qui comprennent:

remplaçant simplement la valeur ...

${parameter} 

expansion à une sous-chaîne ...

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

Remplacer la longueur de la valeur des paramètres ...

${#parameter} 

expansion sur un match au début du paramètre ...

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

expansion sur un match à la fin du paramètre ...

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

élargit le paramètre pour trouver et remplacer une chaîne ...

${parameter/pattern/string} 

Ce sont mon interprétation des parties que je crois comprendre de cette section des pages de manuel. Faites-moi savoir si j'ai manqué quelque chose d'important.

+0

Il suffit de réaliser qu'il y a une différence légèrement subtile entre # et ## et% et %%. Ces extensions ne comprennent pas non plus les noms de fichiers. – johnny

Questions connexes