K naplnění proměnné smyčky můžete použít Bashovo rozšíření parametru substituce vzoru. Například:
MANPATH=/usr/lib:/usr/sfw/lib:/usr/info
# Replace colons with spaces to create list.
for path in ${MANPATH//:/ }; do
echo "$path"
done
Poznámka:Neuzavírejte substituční rozšíření do uvozovek. Chcete, aby byly rozšířené hodnoty z MANPATH interpretovány for-loop jako samostatná slova, nikoli jako jeden řetězec.
Můžete nastavit Interní oddělovač polí:
( IFS=:
for p in $MANPATH; do
echo "$p"
done
)
Použil jsem subshell, takže změna v IFS se neodráží v mém aktuálním shellu.
Kanonický způsob, jak toho dosáhnout v Bash, je použít read
správně zabudované:
IFS=: read -r -d '' -a path_array < <(printf '%s:\0' "$MANPATH")
Toto je jediné robustní řešení:udělá přesně to, co chcete:rozdělte řetězec na oddělovači :
a buďte v bezpečí s ohledem na mezery, nové řádky a znaky glob, jako je *
, [ ]
, atd. (na rozdíl od ostatních odpovědí:všechny jsou rozbité).
Po tomto příkazu budete mít pole path_array
, a můžete na něj zacyklit:
for p in "${path_array[@]}"; do
printf '%s\n' "$p"
done