FILEPATH_WITH_GLOB="/home/user/file_*"
Ora FILEPATH_WITH_GLOB
contiene/home/user/file_*
FILENAME=$(basename "$FILEPATH_WITH_GLOB")
FILENAME
contiene file_*
.
echo $FILENAME #file_1234
$FILENAME
essendo non quotato nel contesto dell'elenco, quell'espansione subisce l'operatore split + glob, quindi viene espanso all'elenco del file corrispondente: la generazione del nome del file viene eseguita all'espansione dei parametri .
echo ${FILENAME:1:5} #ile_* <---why is this not ile_1
È ancora un'espansione dei parametri non quotata nel contesto dell'elenco, quindi subisce ancora split + glob. Tuttavia qui, il ile_*
modello non corrisponde a nessun file, quindi si espande da solo.
Quello che probabilmente vuoi qui è:
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
Oppure puoi memorizzarli in un array:
shopt -s nullglob
files=(/home/user/file_*)
Se ti interessa solo la prima corrispondenza o sai che esiste una sola corrispondenza, puoi fare riferimento a quel file come $files
. bash
ha quel comportamento di solito fastidioso che si $files
espande ${files[0]}
invece di tutti gli elementi dell'array (un comportamento ereditato da ksh
, risolto in zsh
), ma qui, sarebbe un comportamento desiderato per una volta.
FILEPATH_WITH_GLOB=`echo /home/user/file_*`
dopo la tua spiegazione.