FILEPATH_WITH_GLOB="/home/user/file_*"
এখন, FILEPATH_WITH_GLOB
রয়েছে/home/user/file_*
FILENAME=$(basename "$FILEPATH_WITH_GLOB")
FILENAME
রয়েছে file_*
।
echo $FILENAME #file_1234
$FILENAME
তালিকার প্রেক্ষাপটে অচিরাচরিত হওয়ায়, এই বিস্তৃতিটি স্প্লিট + গ্লোব অপারেটরটির মধ্য দিয়ে চলেছে, সুতরাং এটি মেলানো ফাইলের তালিকায় প্রসারিত হবে: পরামিতি প্রসারণের পরে ফাইলের নাম তৈরি করা হয় ।
echo ${FILENAME:1:5} #ile_* <---why is this not ile_1
এটি এখনও তালিকার প্রসঙ্গে একটি অব্যক্ত প্যারামিটার সম্প্রসারণ, সুতরাং এখনও বিভক্ত + বিশ্বব্যাপী চলছে। তবে এখানে, ile_*
প্যাটার্নটি কোনও ফাইলের সাথে মেলে না, তাই এটি তার পরিবর্তে নিজের কাছে প্রসারিত।
আপনি সম্ভবত এখানে যা চান তা হ'ল:
shopt -s nullglob # have globs expand to nothing when they don't match
set -- /home/user/file_* # expand that pattern into the list of matching
# files in $1, $2...
for file do # loop over them
filename=$(basename -- "$file")
printf '%s\n' "$filename" "${filename:1:5}"
done
অথবা আপনি এগুলিতে একটি অ্যারেতে রাখতে পারেন:
shopt -s nullglob
files=(/home/user/file_*)
যদি আপনি কেবল প্রথম ম্যাচটিই যত্নশীল হন বা আপনি জানেন যে কেবল একটি ম্যাচ রয়েছে তবে আপনি সেই ফাইলটিকে সেই হিসাবে উল্লেখ করতে পারেন $files
। bash
যা সাধারণত বিরক্তিকর আচরণ আছে যা $files
বিস্তৃতি ${files[0]}
পরিবর্তে অ্যারে (ক আচরণ থেকে উত্তরাধিকারসূত্রে সব উপাদানের ksh
, সংশোধন zsh
), কিন্তু এখানে যে একবার একটি চেয়েছিলেন আচরণ হবে।
FILEPATH_WITH_GLOB=`echo /home/user/file_*`
আপনার ব্যাখ্যা পরে একটি workaround করতে পরিচালিত ।