Puede usar la expansión de parámetros de sustitución de patrones de Bash para completar su variable de bucle. Por ejemplo:
MANPATH=/usr/lib:/usr/sfw/lib:/usr/info
# Replace colons with spaces to create list.
for path in ${MANPATH//:/ }; do
echo "$path"
done
Nota:No incluya la expansión de sustitución entre comillas. Desea que los valores expandidos de MANPATH sean interpretados por el bucle for como palabras separadas, en lugar de como una sola cadena.
Puede configurar el separador de campo interno:
( IFS=:
for p in $MANPATH; do
echo "$p"
done
)
Usé un subshell para que el cambio en IFS no se refleje en mi shell actual.
La forma canónica de hacer esto, en Bash, es usar el read
incorporado apropiadamente:
IFS=: read -r -d '' -a path_array < <(printf '%s:\0' "$MANPATH")
Esta es la única solución sólida:hará exactamente lo que desea:dividir la cadena en el delimitador :
y estar seguro con respecto a espacios, saltos de línea y caracteres globales como *
, [ ]
, etc. (a diferencia de las otras respuestas:todas están rotas).
Después de este comando, tendrás una matriz path_array
, y puedes repetirlo:
for p in "${path_array[@]}"; do
printf '%s\n' "$p"
done