Tout d'abord, je suppose que l'utilisation de ls
n'est qu'un exemple. Vous ne pouvez pas analyser la sortie de ls
dans aucun shell, car elle est ambiguë. Lisez Pourquoi vous ne devriez pas analyser la sortie de ls (1) si c'est une nouvelle pour vous. Dans n'importe quel shell, pour obtenir une liste de fichiers, utilisez des caractères génériques, par exemple files=(*)
.
Dans zsh, comme dans d'autres shells, le résultat de la substitution de commande est divisé en mots au niveau des espaces (plus précisément, en fonction de la valeur de IFS
). (Contrairement à d'autres shells, le résultat de la substitution de commande n'est pas soumis à la globalisation dans zsh.) Donc, si la sortie de la ls
commande est
hello world
wibble
puis files=($(ls))
définit la files
matrice pour contenir 3 éléments: hello
, world
et wibble
.
Si la substitution de commande est entre guillemets, aucun fractionnement n'est effectué. Vous pouvez effectuer un fractionnement personnalisé avec des indicateurs d'extension de paramètres . Utilisez l' @
indicateur pour indiquer que le résultat du fractionnement doit être un tableau (curieusement, vous devez conserver l'expansion entre guillemets doubles, c'est "${(@)…}"
-à- dire , même si la chaîne entre guillemets doubles s'étendra sur plusieurs mots). Pour le fractionnement, utilisez le s
drapeau, par exemple "${(@s:,:)…}"
pour séparer les virgules; le f
drapeau se divise uniquement aux sauts de ligne.
files=("${(@f)$(ls)}")
Notez que la bonne façon d'itérer sur un tableau en général est for f in $files[@]
de $files
supprimer les éléments vides (ici, cela n'a pas d'importance car les éléments ne seront pas vides).
print $f
interprète $f
comme un commutateur s'il commence par un -
et développe des barres obliques inverses $f
. Utilisez print -r -- $f
, ou print -rn -- $f
si vous ne souhaitez pas ajouter de nouvelle ligne après la chaîne.
(…)
est nécessaire pour qu'il s'agisse d'files
un tableau et non d'une chaîne (qui contiendrait la concaténation des lignes de la commande, annulant le fractionnement effectué par(f)
). 2. Avecfoo=$'one\n\nthree', contrast
print -rl $ {(f) foo} `etprint "${(@f)foo}"
. Les guillemets doubles sont nécessaires pour conserver les lignes vides, dont vous n'obtiendrez pasls
mais qui peuvent arriver avec d'autres commandes.Dans zsh, vous pouvez utiliser l'expansion du shell qui n'effectue pas le fractionnement de mots par défaut. Essayer
la source