গৃহীত উত্তর ভাল কাজ করে টিপিক্যাল ক্ষেত্রে কিন্তু ব্যর্থ প্রান্ত মামলা , যথা:
- এক্সটেনশন ছাড়াই ফাইলনামের জন্য ( এই উত্তরের অবশিষ্টাংশে প্রত্যয় নামে পরিচিত )
extension=${filename##*.}
খালি স্ট্রিংয়ের পরিবর্তে ইনপুট ফাইলের নাম দেয়।
extension=${filename##*.}
প্রাথমিকটি .
কনভেনশনের বিপরীতে অন্তর্ভুক্ত করে না ।
- অন্ধভাবে প্রিপেন্ডিং
.
প্রত্যয় ছাড়াই ফাইল নামের জন্য কাজ করবে না।
filename="${filename%.*}"
কনফিগারেশনের বিপরীতে যদি ইনপুট ফাইলের নামটি শুরু হয় .
এবং এর সাথে কোনও .
অক্ষর (যেমন, .bash_profile
) না থাকে তবে খালি স্ট্রিংটি হবে ।
---------
সুতরাং, সমস্ত প্রান্তের কেসগুলি কভার করে এমন দৃ a ় সমাধানের জটিলতা একটি ফাংশনটির জন্য কল করে - নীচে এর সংজ্ঞাটি দেখুন; এটি কোনও পথের সমস্ত উপাদান ফিরে আসতে পারে ।
উদাহরণ কল:
splitPath '/etc/bash.bashrc' dir fname fnameroot suffix
# -> $dir == '/etc'
# -> $fname == 'bash.bashrc'
# -> $fnameroot == 'bash'
# -> $suffix == '.bashrc'
নোট করুন যে ইনপুট পাথের পরে যুক্তিগুলি অবাধে চয়ন করা হয়েছে, অবস্থানগত ভেরিয়েবলের নাম ।
ভেরিয়েবলগুলি এড়িয়ে যাওয়ার জন্য যেগুলি আগ্রহী সেগুলির আগে নয়, নির্দিষ্ট করুন _
(থ্রো-অ্যাওর ভেরিয়েবল ব্যবহার করার জন্য $_
) বা ''
; উদাহরণস্বরূপ, কেবলমাত্র ফাইলনামের মূল এবং এক্সটেনশানটি এক্সট্রাক্ট করতে, ব্যবহার করুন splitPath '/etc/bash.bashrc' _ _ fnameroot extension
।
# SYNOPSIS
# splitPath path varDirname [varBasename [varBasenameRoot [varSuffix]]]
# DESCRIPTION
# Splits the specified input path into its components and returns them by assigning
# them to variables with the specified *names*.
# Specify '' or throw-away variable _ to skip earlier variables, if necessary.
# The filename suffix, if any, always starts with '.' - only the *last*
# '.'-prefixed token is reported as the suffix.
# As with `dirname`, varDirname will report '.' (current dir) for input paths
# that are mere filenames, and '/' for the root dir.
# As with `dirname` and `basename`, a trailing '/' in the input path is ignored.
# A '.' as the very first char. of a filename is NOT considered the beginning
# of a filename suffix.
# EXAMPLE
# splitPath '/home/jdoe/readme.txt' parentpath fname fnameroot suffix
# echo "$parentpath" # -> '/home/jdoe'
# echo "$fname" # -> 'readme.txt'
# echo "$fnameroot" # -> 'readme'
# echo "$suffix" # -> '.txt'
# ---
# splitPath '/home/jdoe/readme.txt' _ _ fnameroot
# echo "$fnameroot" # -> 'readme'
splitPath() {
local _sp_dirname= _sp_basename= _sp_basename_root= _sp_suffix=
# simple argument validation
(( $# >= 2 )) || { echo "$FUNCNAME: ERROR: Specify an input path and at least 1 output variable name." >&2; exit 2; }
# extract dirname (parent path) and basename (filename)
_sp_dirname=$(dirname "$1")
_sp_basename=$(basename "$1")
# determine suffix, if any
_sp_suffix=$([[ $_sp_basename = *.* ]] && printf %s ".${_sp_basename##*.}" || printf '')
# determine basename root (filemane w/o suffix)
if [[ "$_sp_basename" == "$_sp_suffix" ]]; then # does filename start with '.'?
_sp_basename_root=$_sp_basename
_sp_suffix=''
else # strip suffix from filename
_sp_basename_root=${_sp_basename%$_sp_suffix}
fi
# assign to output vars.
[[ -n $2 ]] && printf -v "$2" "$_sp_dirname"
[[ -n $3 ]] && printf -v "$3" "$_sp_basename"
[[ -n $4 ]] && printf -v "$4" "$_sp_basename_root"
[[ -n $5 ]] && printf -v "$5" "$_sp_suffix"
return 0
}
test_paths=(
'/etc/bash.bashrc'
'/usr/bin/grep'
'/Users/jdoe/.bash_profile'
'/Library/Application Support/'
'readme.new.txt'
)
for p in "${test_paths[@]}"; do
echo ----- "$p"
parentpath= fname= fnameroot= suffix=
splitPath "$p" parentpath fname fnameroot suffix
for n in parentpath fname fnameroot suffix; do
echo "$n=${!n}"
done
done
ফাংশনটি ব্যবহার করে এমন টেস্ট কোড:
test_paths=(
'/etc/bash.bashrc'
'/usr/bin/grep'
'/Users/jdoe/.bash_profile'
'/Library/Application Support/'
'readme.new.txt'
)
for p in "${test_paths[@]}"; do
echo ----- "$p"
parentpath= fname= fnameroot= suffix=
splitPath "$p" parentpath fname fnameroot suffix
for n in parentpath fname fnameroot suffix; do
echo "$n=${!n}"
done
done
প্রত্যাশিত আউটপুট - প্রান্তের কেসগুলি নোট করুন:
- একটি ফাইল নাম যার প্রত্যয় নেই
- একটি ফাইলের নাম দিয়ে শুরু হবে
.
( প্রত্যয়টির শুরু হিসাবে বিবেচনা করা হবে না )
- শেষ হওয়া একটি ইনপুট পাথ
/
(পিছনে /
অগ্রাহ্য করা হবে)
- একটি ইনপুট পাথ যা কেবলমাত্র একটি ফাইলের নাম (
.
প্যারেন্ট পাথ হিসাবে ফিরে আসে)
- একটি ফাইলের নাম যা
.
প্রিফিক্সড টোকেনের চেয়ে বেশি (কেবলমাত্র শেষেরটি প্রত্যয় হিসাবে বিবেচিত হবে):
----- /etc/bash.bashrc
parentpath=/etc
fname=bash.bashrc
fnameroot=bash
suffix=.bashrc
----- /usr/bin/grep
parentpath=/usr/bin
fname=grep
fnameroot=grep
suffix=
----- /Users/jdoe/.bash_profile
parentpath=/Users/jdoe
fname=.bash_profile
fnameroot=.bash_profile
suffix=
----- /Library/Application Support/
parentpath=/Library
fname=Application Support
fnameroot=Application Support
suffix=
----- readme.new.txt
parentpath=.
fname=readme.new.txt
fnameroot=readme.new
suffix=.txt