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

Проблема у меня прямо здесь:Как использовать номер аргумента переменной в сценарии bash?

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

Я просто хочу, чтобы перебрать все аргументы, не считая первого, должно быть достаточно легко, но у меня трудное время выяснить, как сделать эту работу

ответ

15

со страницы Баш человека:

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. 

Таким образом, ваш цикл будет выглядеть примерно так:

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

Если все, что вы пытаетесь сделать, это цикл по аргументам, попробовать что-то вроде этого:

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

Чтобы получить код работает, хотя, попробуйте следующее:

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

это работает, но я не понимаю, почему! требуется, кажется, что $ {num} должен работать. Как бы вы прочитали этот пост? выглядит как «не num», но это не имеет смысла. –

+0

$ {num} - это то же самое, что и $ num. $ {! num} - обозначение косвенной переменной. Похоже, что \ $$ num будет работать, хотя, согласно тому, что я читал, «нотация $ {! Variable} значительно превосходит ноту« eval var1 = \ $$ var2 »(http: // www.faqs.org/docs/abs/HTML/bash2.html) – amertune

1

если вы не хотите включать первый, способ сделать это - использовать shift. Или вы можете попробовать это. представьте, переменную s это ваши аргументы, переданные в.

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

Конечно, это предположит, что вы не будете проходить в строках, одно слово самого по себе.

Смежные вопросы