Bir işleve yapılan her argüman bir skalerdir ve siz bir dizi iletmeye çalışıyorsunuzdur. Yazarken
a=(foo bar qux)
moveFaster "$src" "$dst" "${a[@]}"
: o zaman moveFaster beş argüman alıp $src, $dst, foo, barve qux. Eğer yazarsanız, moveFaster "$src" "$dst" "$a"sadece dizinin ilk elemanı işleve iletilir, çünkü $akendi başına dizinin ilk elemanına genişler. Ayrıca, typonu bir skaler değişken yapar.
Tek bir diziyi işleve geçirdiğiniz için, kalan tüm parametrelerden oluştuğunu beyan edebilirsiniz.
moveFaster () {
src="$1"
dst="$2"
shift 2
typ=("$@")
…
}
İlgili bir notta, söz konusu dosya adlarından herhangi biri beyaz boşluk veya genel karakter ( ?*\[) içeriyorsa, komut dosyanız olağanüstü başarısız olur . Bundan kaçınmak için, bu basit kabuk programlama kuralına uyun: değişken sübstitüsyonların etrafına her zaman çift tırnak işareti koyun (belirli bir durumda neden olmaması gerektiğini anlamadığınız sürece).
function moveFaster(){
src="$1"
dst="$2"
typ=("$@")
if [ ! -d "$dst" ]; then mkdir -- "$dst"; fi
for i in "${typ[@]}"; do
find "$src" -name "${i}" -exec mv {} "${dst}" \;
done
}
Bir kenara bırakırsanız, bash sürüm 4 veya daha üstü varsa, bunu yalnızca bash özellikleriyle kolayca kolayca yapabilirsiniz. Bu extglobseçenek gibi uzatılmış küre desenlerine izin verir @(PATTERN1|PATTERN2). Bu globstarseçenek **/PATTERN, adı PATTERNalt dizinlerde yinelenen bir şekilde eşleşen dosyaları eşleştirmeye izin verir .
shopt -s extglob globstar
mkdir -p /common/destination/directory
mv /path/to/source/**/@(*.txt|*.html|README) /common/destination/directory