FILEPATH_WITH_GLOB="/home/user/file_*"
Тепер, FILEPATH_WITH_GLOB
містить/home/user/file_*
FILENAME=$(basename "$FILEPATH_WITH_GLOB")
FILENAME
містить file_*
.
echo $FILENAME #file_1234
$FILENAME
не котируючись у контексті списку, це розширення зазнає оператора split + 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_*`
Після вашого пояснення вдалося вирішити проблему .