[ -f /*.txt ]
यदि कोई एक (और केवल एक) गैर-छुपी हुई फ़ाइल /जिसका नाम समाप्त होता है, .txtऔर यदि वह फ़ाइल एक नियमित फ़ाइल है या एक नियमित फ़ाइल के लिए सिम्लिंक है, तो केवल तभी वापस आएगा ।
ऐसा इसलिए है क्योंकि वाइल्डकार्ड कमांड (यहां [) में पारित होने से पहले शेल द्वारा विस्तारित किए जाते हैं ।
अगर वहाँ एक है तो /a.txtऔर /b.txt, [5 तर्क पारित हो जाएगा: [, -f, /a.txt, /b.txtऔर ]। [फिर शिकायत करेंगे कि -fबहुत सारे तर्क दिए जाते हैं।
आपको लगता है कि जाँच करना चाहते हैं *.txtपैटर्न कम से कम एक गैर छिपा फ़ाइल (नियमित या नहीं) के लिए विस्तारित:
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 nullglobहै bashविशिष्ट है, लेकिन गोले की तरह ksh93, zsh, yash, tcshबराबर बयान है।
ध्यान दें कि यह निर्देशिका की सामग्री को पढ़कर उन फ़ाइलों को ढूँढता है, यह उन फ़ाइलों की कोशिश नहीं करता है और उन सभी तक पहुँच प्राप्त करता है जो इसे समाधानों की तुलना में अधिक कुशल बनाता है जो शेल द्वारा गणना की गई फ़ाइलों की तरह lsया statउस सूची पर आदेशों को कहते हैं ।
मानक shसमतुल्य होगा:
set -- [*].txt *.txt
case "$1$2" in
('[*].txt*.txt') ;;
(*) shift; script "$@"
esac
समस्या यह है कि बॉर्न या पोसिक्स गोले के साथ, यदि कोई पैटर्न मेल नहीं खाता है, तो यह अपने आप फैलता है। इसलिए अगर इसका *.txtविस्तार होता है *.txt, तो आप नहीं जानते कि क्या यह है क्योंकि .txtनिर्देशिका में कोई फ़ाइल नहीं है या क्योंकि वहाँ एक फ़ाइल कहा जाता है *.txt। उपयोग [*].txt *.txtकरने से दोनों के बीच भेदभाव करने की अनुमति मिलती है।
/? इसके अलावा, आप पहले एक अर्धविराम याद कर रहे हैंfi।