Pertama, saya berasumsi bahwa penggunaan ls
hanyalah sebuah contoh. Anda tidak dapat mem-parsing output ls
di 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 ls
perintah adalah
hello world
wibble
kemudian files=($(ls))
menetapkan files
array yang mengandung 3 unsur: hello
, world
dan 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 s
bendera, misalnya "${(@s:,:)…}"
untuk membelah koma; yang f
bendera perpecahan di baris saja.
files=("${(@f)$(ls)}")
Perhatikan bahwa cara yang tepat untuk beralih pada array secara umum adalah for f in $files[@]
, seperti $files
menghapus elemen kosong (di sini, tidak masalah karena elemen tidak akan kosong).
print $f
ditafsirkan $f
sebagai saklar jika dimulai dengan -
dan memperluas garis miring terbalik di $f
. Gunakan print -r -- $f
, atau print -rn -- $f
jika Anda tidak ingin menambahkan baris baru setelah string.
(…)
diperlukan sehinggafiles
merupakan array dan bukan string (yang akan berisi gabungan dari baris-baris dari perintah, membatalkan pemisahan yang dilakukan oleh(f)
). 2. Denganfoo=$'one\n\nthree', contrast
print -rl $ {(f) foo} `danprint "${(@f)foo}"
. Kutipan ganda diperlukan untuk mempertahankan baris kosong, yang tidak akan Anda dapatkan darils
tetapi dapat terjadi dengan perintah lain.Di zsh Anda dapat menggunakan ekspansi shell yang tidak melakukan pemisahan kata secara default. Mencoba
sumber