2010-04-05 8 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 

El problema que estoy teniendo es aquí:¿Cómo uso un número de argumento variable en un script bash?

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

Quiero simplemente iterar sobre todos los argumentos sin incluir el primero, debería ser bastante fácil, pero estoy teniendo un momento difícil encontrar la manera de hacer este trabajo

Respuesta

15

de la página 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. 

Así que el bucle se va a ver algo como esto:

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

Si todo lo que estamos tratando de hacer es un bucle sobre los argumentos, intentar algo como esto:

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

Para obtener su código de trabajo, sin embargo, intenta esto:

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

esto funciona, pero no entiendo por qué! es obligatorio, parece que $ {num} debería funcionar. ¿Cómo leerías esa declaración? parece "no num", pero eso no tiene sentido –

+0

$ {num} es lo mismo que $ num. $ {! num} es la notación de una variable indirecta. Parece que \ $$ num también funcionaría, aunque, según lo que he leído, "la notación $ {! Variable} es muy superior a la anterior 'eval var1 = \ $$ var2'" (http: // www.faqs.org/docs/abs/HTML/bash2.html) – amertune

1

si no desea incluir el primero, la forma de hacerlo es usar shift. O puedes intentar esto. Imaginemos variables s es su argumentos pasados.

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

Por supuesto, esto asume que no se le pasa en las cadenas que es una palabra por sí mismo.

Cuestiones relacionadas