Vous pouvez utiliser l'expansion des paramètres de substitution de modèle de Bash pour remplir votre variable de boucle. Par exemple :
MANPATH=/usr/lib:/usr/sfw/lib:/usr/info
# Replace colons with spaces to create list.
for path in ${MANPATH//:/ }; do
echo "$path"
done
Remarque :Ne placez pas le développement de substitution entre guillemets. Vous voulez que les valeurs développées de MANPATH soient interprétées par la boucle for comme des mots séparés, plutôt que comme une chaîne unique.
Vous pouvez définir le séparateur de champs interne :
( IFS=:
for p in $MANPATH; do
echo "$p"
done
)
J'ai utilisé un sous-shell pour que le changement dans IFS ne soit pas reflété dans mon shell actuel.
La manière canonique de le faire, dans Bash, est d'utiliser le read
intégré de manière appropriée :
IFS=: read -r -d '' -a path_array < <(printf '%s:\0' "$MANPATH")
C'est la seule solution robuste :fera exactement ce que vous voulez :diviser la chaîne sur le délimiteur :
et soyez prudent en ce qui concerne les espaces, les nouvelles lignes et les caractères globaux comme *
, [ ]
, etc. (contrairement aux autres réponses :elles sont toutes cassées).
Après cette commande, vous aurez un tableau path_array
, et vous pouvez boucler dessus :
for p in "${path_array[@]}"; do
printf '%s\n' "$p"
done