Geçerli dizinin en az bir gizli olmayan dosya içerdiğini biliyorsanız:
set -- *; echo "$#"
Bu açıkça herhangi bir glob için genelleştirilebilir.
Bir komut dosyasında, bunun konumsal parametrelerin üzerine yazılmasının bazen talihsiz bir yan etkisi vardır. Bunu bir alt kabuk kullanarak veya şöyle bir fonksiyonla (Bourne / POSIX sürümü) çalıştırabilirsiniz:
count_words () {
eval 'shift; '"$1"'=$#'
}
count_words number_of_files *
echo "There are $number_of_files non-dot files in the current directory"
Alternatif bir çözümdür $(ls -d -- * | wc -l). Glob ise *, komut kısaltılabilir $(ls | wc -l). Çıktısını ayrıştırmak lsbeni her zaman tedirgin ediyor, ancak burada dosya adlarınız yeni satırlar içermediği veya lskaçtığınız sürece çalışmalıdır . Ve $(ls -d -- * 2>/dev/null | wc -l)(oysa, yani, bu, bu durumda 0 döndürür incelikle olmayan bir eşleştirme için defalarca talebi işleme avantajı vardır set *topak boş olabilir, bu yöntem derinde test gerektirir).
Dosya adları yeni satır karakterleri içeriyorsa, bir alternatif kullanmaktır $(ls -d ./* | grep -c /).
Bir globun genişlemesini geçmeye dayanan bu çözümlerden herhangi biri , çok fazla eşleşen dosya varsa ls, argüman listesi çok uzun bir hata ile başarısız olabilir .