FILEPATH_WITH_GLOB="/home/user/file_*"
ตอนนี้FILEPATH_WITH_GLOB
มี/home/user/file_*
FILENAME=$(basename "$FILEPATH_WITH_GLOB")
FILENAME
file_*
มี
echo $FILENAME #file_1234
$FILENAME
ถูก unquoted ในบริบทรายการการขยายตัวที่ผ่านการประกอบการแยก + glob เพื่อให้ขยายไปยังรายการของไฟล์ที่ตรงกัน: รุ่นชื่อไฟล์จะดำเนินการเมื่อมีการขยายตัวพารามิเตอร์
echo ${FILENAME:1:5} #ile_* <---why is this not ile_1
มันยังคงเป็นการขยายพารามิเตอร์ที่ไม่มีคำอธิบายในบริบทรายการดังนั้นยังคงผ่านการแยก + glob อย่างไรก็ตามที่นี่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_*`
หลังจากคำอธิบายของคุณ