FILEPATH_WITH_GLOB="/home/user/file_*"
Maintenant, FILEPATH_WITH_GLOB
contient/home/user/file_*
FILENAME=$(basename "$FILEPATH_WITH_GLOB")
FILENAME
contient file_*
.
echo $FILENAME #file_1234
$FILENAME
étant non cité dans le contexte de la liste, cette expansion subit l'opérateur split + glob, de sorte qu'elle est étendue à la liste des fichiers correspondants: la génération du nom de fichier est effectuée lors de l' expansion des paramètres .
echo ${FILENAME:1:5} #ile_* <---why is this not ile_1
Il s'agit toujours d'une extension de paramètre non citée dans le contexte de la liste, donc subit toujours split + glob. Cependant, ici, le ile_*
modèle ne correspond à aucun fichier, il se développe donc à lui-même.
Ce que vous voulez probablement ici, c'est:
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 vous pouvez les stocker dans un tableau:
shopt -s nullglob
files=(/home/user/file_*)
Si vous ne vous souciez que de la première correspondance ou si vous savez qu'il n'y a qu'une seule correspondance, vous pouvez alors faire référence à ce fichier en tant que $files
. bash
a ce comportement généralement ennuyeux qui se $files
développe à la ${files[0]}
place de tous les éléments du tableau (un comportement hérité de ksh
, fixé dans zsh
), mais ici, ce serait un comportement souhaité pour une fois.
FILEPATH_WITH_GLOB=`echo /home/user/file_*`
après votre explication.bash
tableau comme:files=(/home/user/file_*)
.echo
ne doivent pas être utilisées pour des données arbitraires , les variables ne doivent pas être laissées sans guillemets dans les contextes de liste).