FILEPATH_WITH_GLOB="/home/user/file_*"
Agora, FILEPATH_WITH_GLOB
contém /home/user/file_*
FILENAME=$(basename "$FILEPATH_WITH_GLOB")
FILENAME
contém file_*
.
echo $FILENAME #file_1234
$FILENAME
sendo não-referenciado no contexto de lista, essa expansão passa pelo operador split + glob, de modo que é expandida para a lista de arquivos correspondentes: geração de nome de arquivo é executada na expansão de parâmetro .
echo ${FILENAME:1:5} #ile_* <---why is this not ile_1
Ainda é uma expansão de parâmetro sem aspas no contexto da lista, por isso ainda sofre split + glob. No entanto, aqui, o padrão ile_*
não corresponde a nenhum arquivo, por isso, ele se expande para si mesmo.
O que você provavelmente quer aqui é:
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
Ou você pode armazená-los em uma matriz:
shopt -s nullglob
files=(/home/user/file_*)
Se você se importa apenas com a primeira correspondência, ou se sabe que há apenas uma correspondência, você pode se referir a esse arquivo como $files
. bash
tem esse comportamento geralmente irritante que $files
expande para ${files[0]}
em vez de todos os elementos da matriz (um comportamento herdado de ksh
, corrigido em zsh
), mas aqui, isso seria um comportamento desejado pela primeira vez.