2010-04-05 6 views
13
#!/bin/bash 
# Script to output the total size of requested filetype recursively 

# Error out if no file types were provided 
if [ $# -lt 1 ] 
then 
    echo "Syntax Error, Please provide at least one type, ex: sizeofTypes {filetype1} {filetype2}" 
    exit 0 
fi 

#set first filetype 
types="-name *."$1 

#loop through additional filetypes and append 
num=1 
while [ $num -lt $# ] 
do 
    ((num++)) 
    types=$types' -o -name *.'$$num 
done 

echo "TYPES="$types 

find . -name '*.'$1 | xargs du -ch *.$1 | grep total 

Le problème que je vais avoir est ici:Comment utiliser un numéro d'argument variable dans un script bash?

#loop through additional filetypes and append 
    num=1 
    while [ $num -lt $# ] 
    do 
     ((num++)) 
     types=$types' -o -name *.'>>$$num<< 
    done 

Je veux simplement itérer sur tous les arguments non compris la première, devrait être assez facile, mais je suis un moment difficile déterminer comment faire ce travail

Répondre

15

de la page man bash:

shift [n] 
      The positional parameters from n+1 ... are renamed to $1 .... 
      Parameters represented by the numbers $# down to $#-n+1 are 
      unset. n must be a non-negative number less than or equal to 
      $#. If n is 0, no parameters are changed. If n is not given, 
      it is assumed to be 1. If n is greater than $#, the positional 
      parameters are not changed. The return status is greater than 
      zero if n is greater than $# or less than zero; otherwise 0. 

Ainsi, votre boucle va ressembler à quelque chose comme ceci:

#loop through additional filetypes and append 
while [ $# -gt 0 ] 
do 
    types=$types' -o -name *.'$1 
    shift 
done 
5

Si tout ce que vous essayez de faire est en boucle sur les arguments, essayez quelque chose comme ceci:

for type in "[email protected]"; do 
    types="$types -o -name *.$type" 
done 

Pour obtenir votre code de travail bien, essayez ceci:

#loop through additional filetypes and append 
num=1 
while [ $num -le $# ] 
do 
    ((num++)) 
    types=$types' -o -name *.'${!num} 
done 
+0

cela fonctionne, mais je ne comprends pas pourquoi le! est requis, il semble que $ {num} devrait fonctionner. Comment liriez-vous cette déclaration? ressemble à "non num" mais cela n'a pas de sens –

+0

$ {num} est le même que $ num. $ {! num} est la notation pour une variable indirecte. Il semblerait que \ $$ num fonctionnerait également, bien que, d'après ce que j'ai lu, "la notation $ {! Variable} soit largement supérieure à l'ancienne 'eval var1 = \ $$ var2'" (http: // www.faqs.org/docs/abs/HTML/bash2.html) – amertune

1

si vous ne voulez pas inclure le premier, la façon de le faire est d'utiliser shift. Ou vous pouvez essayer cela. imaginez la variable s est vos arguments transmis.

$ s="one two three" 
$ echo ${s#* } 
two three 

Bien sûr, cela suppose que vous ne serez pas de passage dans les chaînes qui est un mot par lui-même.

Questions connexes