Pertama, saya berasumsi bahwa penggunaan lshanyalah sebuah contoh. Anda tidak dapat mem-parsing output lsdi shell apa pun, karena ini ambigu. Baca Mengapa Anda tidak perlu menguraikan output ls (1) jika ini berita untuk Anda. Dalam shell apa pun, untuk mendapatkan daftar file, gunakan wildcard, mis files=(*).
Di zsh, seperti di shell lain, hasil substitusi perintah dibagi menjadi kata-kata di karakter spasi (lebih tepatnya, sesuai dengan nilai IFS). (Tidak seperti shell lain, hasil substitusi perintah tidak mengalami globbing di zsh.) Jadi jika output dari lsperintah adalah
hello world
wibble
kemudian files=($(ls))menetapkan filesarray yang mengandung 3 unsur: hello, worlddan wibble.
Jika substitusi perintah dalam tanda kutip ganda, maka tidak ada pemisahan yang dilakukan. Anda dapat melakukan pemisahan kustom dengan flag ekspansi parameter . Gunakan @bendera untuk menunjukkan bahwa hasil pemisahan adalah menjadi array (anehnya, Anda perlu menjaga ekspansi dalam tanda kutip ganda, yaitu "${(@)…}", meskipun string yang dikutip ganda akan diperluas ke beberapa kata). Untuk pemisahan, gunakan sbendera, misalnya "${(@s:,:)…}"untuk membelah koma; yang fbendera perpecahan di baris saja.
files=("${(@f)$(ls)}")
Perhatikan bahwa cara yang tepat untuk beralih pada array secara umum adalah for f in $files[@], seperti $filesmenghapus elemen kosong (di sini, tidak masalah karena elemen tidak akan kosong).
print $fditafsirkan $fsebagai saklar jika dimulai dengan -dan memperluas garis miring terbalik di $f. Gunakan print -r -- $f, atau print -rn -- $fjika Anda tidak ingin menambahkan baris baru setelah string.