È possibile utilizzare l'espansione del parametro di sostituzione del modello di Bash per popolare la variabile del ciclo. Ad esempio:
MANPATH=/usr/lib:/usr/sfw/lib:/usr/info
# Replace colons with spaces to create list.
for path in ${MANPATH//:/ }; do
echo "$path"
done
Nota:non racchiudere l'espansione di sostituzione tra virgolette. Vuoi che i valori espansi da MANPATH vengano interpretati dal ciclo for come parole separate, piuttosto che come una singola stringa.
Puoi impostare il separatore di campo interno:
( IFS=:
for p in $MANPATH; do
echo "$p"
done
)
Ho usato una subshell in modo che il cambiamento in IFS non si rifletta nella mia attuale shell.
Il modo canonico per farlo, in Bash, è usare read
incorporato in modo appropriato:
IFS=: read -r -d '' -a path_array < <(printf '%s:\0' "$MANPATH")
Questa è l'unica soluzione robusta:farà esattamente quello che vuoi:dividi la stringa sul delimitatore :
ed essere prudenti rispetto a spazi, newline e caratteri glob come *
, [ ]
, ecc. (a differenza delle altre risposte:sono tutte rotte).
Dopo questo comando, avrai un array path_array
, e puoi eseguirne il loop:
for p in "${path_array[@]}"; do
printf '%s\n' "$p"
done