[ -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
।