FILEPATH_WITH_GLOB="/home/user/file_*"
Teraz FILEPATH_WITH_GLOBzawiera/home/user/file_*
FILENAME=$(basename "$FILEPATH_WITH_GLOB")
FILENAMEzawiera file_*.
echo $FILENAME #file_1234
$FILENAMEponieważ nie jest cytowany w kontekście listy, to rozwinięcie podlega operatorowi split + glob, więc zostaje ono rozszerzone na listę pasujących plików: generowanie nazw plików następuje po rozwinięciu parametrów .
echo ${FILENAME:1:5} #ile_* <---why is this not ile_1
Jest to wciąż niecytowane rozszerzenie parametrów w kontekście listy, więc nadal podlega podziałowi + glob. Jednak tutaj ile_*wzorzec nie pasuje do żadnego pliku, więc zamiast tego rozwija się do siebie.
Prawdopodobnie chcesz tutaj:
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
Lub możesz przechowywać je w tablicy:
shopt -s nullglob
files=(/home/user/file_*)
Jeśli zależy Ci tylko na pierwszym dopasowaniu lub wiesz, że istnieje tylko jedno dopasowanie, możesz odnieść się do tego pliku jako $files. bashma to zwykle denerwujące zachowanie, które $filesrozwija się ${files[0]}zamiast wszystkich elementów tablicy (zachowanie odziedziczone ksh, ustalone w zsh), ale tutaj byłoby to zachowanie pożądane raz.
FILEPATH_WITH_GLOB=`echo /home/user/file_*`po wyjaśnieniu.