Değişken okuyan bir işlevi nasıl kullanabilirim?


6
 #!/bin/bash

 declare -a a=(`ls`)

 var=0

 while [ -n "${a[$var]}" ]
 do
     var=`expr $var + 1`
 done

 Pdir(){
     if[ "`stat -c %F ${a[$i]}`" = "directory" ]
     then
         echo "     __ "
         echo "/---/  |"
         echo "|  d   |"
         echo "--------"
         echo "${a[$i]}"
     else
         echo "nope"
     fi
 }

 for((i=0; i < var ; i++))
 do
         Pdir($i)
 done

Bu benim kodum. Yapmak istediğim, dizini bulup yazdırdığımda:

     __
/---/  |
|   d  |
--------
"filename"

ByteCommander'ın cevabında söylediklerine ek olarak, her zaman en üste fonksiyonlar bildirmeli ve bunları kullanan ana kodu yerleştirmelisiniz. Öyleyse, işlevini #! çizgi
Sergiy Kolodyazhnyy

Yararsız kullanımıls . $pathBir dizin kullanımı olup olmadığını test etmek için [ -d "$path" ].
David Foerster

Yanıtlar:


12

İşlev çağrınız yanlış:

Pdir($i)        # this is wrong

Bash'de, tıpkı ikili çalıştırılabilir dosyaları çağırdığınız gibi, isimlerini komut olarak yazıp tüm argümanları arkasına koyarak, boşluklarla ayrılmış ve herhangi bir parantez içine alınmamış olarak çağırırsınız:

Pdir $i         # this is correct, but not good

Unutmayın ki değişkenleri hemen hemen her zaman çift tırnak içine almalısınız, boşluk bırakmaları halinde ayrılmalarını ve çoklu argümanlar olarak yorumlanmalarını engellemek için en iyi yol şöyle olacaktır:

Pdir "$i"       # this is how you do it

Bir diğer küçük hata ifda [test ile test arasında bir boşluğa ihtiyacınız olması .

Ayrıca değişkeni tekrar alıntılamalısınız ve bunun $(...)yerine daha modern komut değiştirme sözdizimini kullanmanız önerilir `...`. İkame kendisi çift tırnak içine alınmış olsa bile komut ikame parantezleri içindeki çift tırnak işaretine izin verildiğine dikkat edin.

if [ "$(stat -c %F "${a[$i]}")" = "directory" ]

Ve yerine çıkışını yorumlama ls( Neden değil ayrıştırmak ls? ), O kadar iyi geçerli dizin eg dosya ve dizinleri bir dizi almak için bir kabuk topak kullanılarak :

a=(*)

Varsayılan olarak, bunun sadece gizli olmayan dosyaları, yani bir nokta ile başlamayan her şeyi döndürdüğünü unutmayın. Gizli dosyaları ve dizinleri de listelemek dotglobiçin önce betiğinizin içindeki kabuk seçeneğini etkinleştirin :

shopt -s dotglob
a=(*)

8

Kabuk glob'ı */yalnızca dizinleri eşleştirmek için kullanabilirsiniz - böylece ayrı bir dizin denetimine gerek kalmaz:

a=(*/)

İlk döngünüz gereksiz - tek yapması gereken dizideki elementleri saymak. ${#a[@]}

Her durumda, üzerlerinde dolaşmak için aslında öğelerin sayısını bilmek gerekmez - kullanabilirsiniz

for i in "${a[@]}"; do
  Pdir "$i"
done

Ayrıca printf yankıdan iyidir . Yani

#!/bin/bash

Pdir(){
  printf '%s\n%s\n%s\n%s\n' \
  "     __ " \
  "/---/  |" \
  "|  d   |" \
  "--------" \
  "$1"
}


shopt -s nullglob

dirs=(*/)

for d in "${dirs[@]}"; do
  Pdir "$d"
done

Eğer varsa do yani tüm dosyaları işlemek istiyorum a=(*)kullanmak yerine daha sonra, ve açıkça onları test statdoğrudan kabuk testini kullanabilirsiniz seni

[ -d "$i" ]

( help testseçenekleri görmek için kabukta çalıştırın ).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.