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

Sorun şu ki burada:Bash betikindeki değişken argüman numarasını nasıl kullanırım?

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

Sadece ilkini içermeyen tüm argümanlar üzerinde yineleme yapmak istiyorum, yeterince kolay olmalı, ama zor anlar geçiriyorum bu iş nasıl yapılır

cevap

15

yapmak nasıl bulmaktan:

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. 

Yani döngü şuna benzer gidiyor:

Eğer yapmaya çalıştığını tüm döngü argümanları fazla ise
#loop through additional filetypes and append 
while [ $# -gt 0 ] 
do 
    types=$types' -o -name *.'$1 
    shift 
done 
5

, böyle bir şey deneyin:

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

kodunuzu olsa çalışmaya başlamasını sağlamak için bu deneyin:

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

bu işler, ama neden anlamıyorum! gerekli, $ {num} çalışmalı gibi görünüyor. Bu statüyü nasıl okudunuz? "num değil" gibi görünüyor ama bu mantıklı değil –

+0

$ {num} $ num ile aynı. $ {! num} dolaylı bir değişkenin gösterimidir. Görünüşe göre, "$ {! Variable} notasyonu, eski 'eval var1 = \ $$ var2' büyük ölçüde üstündür" (http: // www.faqs.org/docs/abs/HTML/bash2.html) – amertune

1

eğer İlkini dahil etmek istemezsiniz, bunu yapmanın yolu vardiya kullanmaktır. Ya da bunu deneyebilirsin. s değişkeni argümanlar içinde geçirilir düşünün. Elbette

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

, bu tek başına bir kelime dizeleri geçirmeden olmayacak varsayalım.