Anda dapat menggunakan ekspansi parameter substitusi pola Bash untuk mengisi variabel loop Anda. Misalnya:
MANPATH=/usr/lib:/usr/sfw/lib:/usr/info
# Replace colons with spaces to create list.
for path in ${MANPATH//:/ }; do
echo "$path"
done
Catatan:Jangan sertakan perluasan substitusi dalam tanda kutip. Anda ingin nilai yang diperluas dari MANPATH ditafsirkan oleh for-loop sebagai kata-kata terpisah, bukan sebagai string tunggal.
Anda dapat menyetel Pemisah Bidang Internal:
( IFS=:
for p in $MANPATH; do
echo "$p"
done
)
Saya menggunakan subkulit sehingga perubahan di IFS tidak tercermin di shell saya saat ini.
Cara kanonik untuk melakukan ini, di Bash, adalah dengan menggunakan read
bawaan dengan tepat:
IFS=: read -r -d '' -a path_array < <(printf '%s:\0' "$MANPATH")
Ini adalah satu-satunya solusi yang kuat:akan melakukan apa yang Anda inginkan:pisahkan string pada pembatas :
dan aman sehubungan dengan spasi, baris baru, dan karakter glob seperti *
, [ ]
, dll. (tidak seperti jawaban lainnya:semuanya rusak).
Setelah perintah ini, Anda akan memiliki larik path_array
, dan Anda dapat mengulanginya:
for p in "${path_array[@]}"; do
printf '%s\n' "$p"
done