[ -f /*.txt ]
orada sadece true dönecekti birini (ve tek) olmayan gizli dosyayı /adlarına uçları içinde .txto dosya normal bir dosya veya normal dosyaya bir sembolik bağdır ve eğer.
Bunun nedeni, joker karakterlerin komuta geçilmeden önce kabuk tarafından genişletilmesidir (burada [).
Orada bir parça varsa /a.txtve /b.txt, [5 argümanları geçilecek: [, -f, /a.txt, /b.txtve ]. [daha sonra -fçok fazla argüman verildiğinden şikayet ederdi .
*.txtDesenin en az bir gizli olmayan dosyaya genişlediğini kontrol etmek istiyorsanız (normal veya değil):
shopt -s nullglob
set -- *.txt
if [ "$#" -gt 0 ]; then
./script "$@" # call script with that list of files.
fi
# Or with bash arrays so you can keep the arguments:
files=( *.txt )
# apply C-style boolean on member count
(( ${#files[@]} )) && ./script "${files[@]}"
shopt -s nullglobolduğu bashbelirli fakat kabukları gibi ksh93, zsh, yash, tcsheşdeğer ifadeler var.
Dizinin içeriğini okuyarak bu dosyaları bulduğunu, bu dosyalara erişmediğini ve bu dosyalara erişmediğini unutmayın; bu lsda stat, kabuk tarafından hesaplanan dosyaların listesi veya benzeri komutları çağıran çözümlerden daha verimli olmasını sağlar .
Standart sheşdeğer olacaktır:
set -- [*].txt *.txt
case "$1$2" in
('[*].txt*.txt') ;;
(*) shift; script "$@"
esac
Sorun Bourne veya POSIX mermilerinde, eğer bir kalıp uyuşmuyorsa, kendine yayılıyor. Yani, *.txtgenişlerse , dizinde dosya *.txtolmadığı için .txtveya adı verilen bir dosya olduğu için bunun ne olduğunu bilmiyorsunuz *.txt. Kullanımı [*].txt *.txt, ikisi arasında ayrım yapılmasını sağlar.
/? Ayrıca, daha önce bir noktalı virgül eksikfi.