FILEPATH_WITH_GLOB="/home/user/file_*"
Teraz FILEPATH_WITH_GLOB
zawiera/home/user/file_*
FILENAME=$(basename "$FILEPATH_WITH_GLOB")
FILENAME
zawiera file_*
.
echo $FILENAME #file_1234
$FILENAME
ponieważ 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
. bash
ma to zwykle denerwujące zachowanie, które $files
rozwija 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.bash
tablica jak:files=(/home/user/file_*)
.echo
nie powinny być używane do dowolnych danych , zmiennych nie należy pozostawiać bez cudzysłowów w kontekście list).