J'ai besoin d'étendre un modèle glob (comme ../smth*/*, ou /etc/cron*/) dans une liste de fichiers, par programme. Quelle serait la meilleure façon de procéder?
Vous n'avez rien à faire de spécial, ne citez pas le *.
Kevin
1
Bien que si vous essayez de l'analyser, utilisez un tableau comme le dit la réponse.
Kevin
Réponses:
40
Laissez-le simplement se développer à l'intérieur du côté droit d'une déclaration de tableau:
list=(../smth*/)# grab the list
echo "${#list[@]}"# print array length
echo "${list[@]}"# print array elementsfor file in"${list[@]}";do echo "$file";done# loop over the array
Notez que l'option shell nullglobdoit être définie. Il n'est pas défini par défaut.
Il empêche une erreur dans le cas où le glob (ou l'un des globs multiples) ne correspond à aucun nom.
ça ne marche pas. Par exemple: TEST=$(echo your/stuff*) && eval \"$TEST\"affichera:your/stuff*: No such file or directory
Sebastian
@Sebastian c'est un problème de nullglob, voir ci
Alexei Averchenko
1
Non, ce n'est pas un problème nullglob. L'utilisation de caractères scape consiste à évaluer la TESTvariable comme une chaîne incluant *et non développée.
*
.Réponses:
Laissez-le simplement se développer à l'intérieur du côté droit d'une déclaration de tableau:
Notez que l'option shell
nullglob
doit être définie.Il n'est pas défini par défaut.
Il empêche une erreur dans le cas où le glob (ou l'un des globs multiples) ne correspond à aucun nom.
Installez-le
bash
avecou
zsh
avecla source
unsetopt
et le même paramètre que celui utilisé poursetopt
.Pas besoin de trop compliquer les choses:
la source
TEST=$(echo your/stuff*) && eval \"$TEST\"
affichera:your/stuff*: No such file or directory
TEST
variable comme une chaîne incluant*
et non développée.