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_*`
आपके स्पष्टीकरण के बाद वर्कअराउंड करने का प्रबंधन ।