FILEPATH_WITH_GLOB="/home/user/file_*"
Ahora FILEPATH_WITH_GLOB
contiene/home/user/file_*
FILENAME=$(basename "$FILEPATH_WITH_GLOB")
FILENAME
contiene file_*
.
echo $FILENAME #file_1234
$FILENAME
al no estar entre comillas en el contexto de la lista, esa expansión se somete al operador split + glob, por lo que se expande a la lista de archivos coincidentes: la generación del nombre de archivo se realiza al expandir los parámetros .
echo ${FILENAME:1:5} #ile_* <---why is this not ile_1
Sigue siendo una expansión de parámetros sin comillas en el contexto de la lista, por lo que aún se divide + glob. Sin embargo, aquí, el ile_*
patrón no coincide con ningún archivo, por lo que se expande a sí mismo.
Lo que probablemente quieras aquí es:
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
O puede almacenarlos en una matriz:
shopt -s nullglob
files=(/home/user/file_*)
Si solo le importa la primera coincidencia, o sabe que solo hay una coincidencia, puede referirse a ese archivo como $files
. bash
tiene ese comportamiento generalmente molesto que se $files
expande en ${files[0]}
lugar de todos los elementos de la matriz (un comportamiento heredado de ksh
, arreglado zsh
), pero aquí, ese sería un comportamiento deseado por una vez.
FILEPATH_WITH_GLOB=`echo /home/user/file_*`
después de su explicación.bash
matriz como:files=(/home/user/file_*)
.echo
no deberían usarse para datos arbitrarios , las variables no deberían dejarse sin comillas en contextos de lista).