array=${ls -d */}
echo ${array[@]}
J'ai trois répertoires : ww
ee
qq
. Je veux les mettre dans un tableau et ensuite afficher le tableau.
array=${ls -d */}
echo ${array[@]}
J'ai trois répertoires : ww
ee
qq
. Je veux les mettre dans un tableau et ensuite afficher le tableau.
Il s'agirait de ceci
array=($(ls -d */))
MODIFIER : Voir la solution de Gordon Davisson pour une réponse plus générale (c'est-à-dire si vos noms de fichiers contiennent des caractères spéciaux). Cette réponse n'est qu'une correction de syntaxe.
Chaque fois que possible, vous devriez éviter de parser la sortie de ls
(voir le wiki de Greg sur le sujet). Fondamentalement, la sortie de ls
sera ambiguë s'il y a des caractères spéciaux dans l'un des noms de fichiers. C'est aussi généralement une perte de temps. Dans ce cas, lorsque vous exécutez ls -d */
, ce qui se passe est que le shell développe */
en une liste de sous-répertoires (ce qui est déjà exactement ce que vous voulez), transmet cette liste en arguments à ls -d
, qui regarde chacun, dit "oui, c'est bien un répertoire" et l'affiche (dans un format incohérent et parfois ambigu). La commande ls
ne fait rien de utile!
Bon, d'accord, elle fait une chose qui est utile : s'il n'y a pas de sous-répertoires, */
restera tel quel, ls
cherchera un sous-répertoire nommé "*", ne le trouvera pas, imprimera un message d'erreur disant qu'il n'existe pas (sur stderr), et ne n'imprimera pas "*/" (sur stdout).
La manière plus propre de créer un tableau de noms de sous-répertoires est d'utiliser le glob (*/
) sans le passer à ls
. Mais afin d'éviter de mettre "*/" dans le tableau s'il n'y a pas de sous-répertoires réels, vous devriez d'abord définir nullglob (encore une fois, voir le wiki de Greg) :
shopt -s nullglob
array=(*/)
shopt -u nullglob # Désactivez nullglob pour vous assurer qu'il n'interfère pas avec quoi que ce soit plus tard
echo "${array[@]}" # Remarquez les guillemets doubles pour éviter un parsing supplémentaire des caractères spéciaux dans les noms de fichiers
Si vous voulez imprimer un message d'erreur s'il n'y a pas de sous-répertoires, il vaut mieux le faire vous-même :
if (( ${#array[@]} == 0 )); then
echo "Aucun sous-répertoire trouvé" >&2
fi
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.