Saya pikir yang berikut ini akan mengelompokkan output my_command
dalam array baris:
IFS='\n' array_of_lines=$(my_command);
sehingga $array_of_lines[1]
akan merujuk pada baris pertama dalam output dari my_command
, $array_of_lines[2]
ke yang kedua, dan sebagainya.
Namun, perintah di atas sepertinya tidak berfungsi dengan baik. Tampaknya juga membagi output my_command
sekitar karakter n
, seperti yang telah saya periksa print -l $array_of_lines
, yang saya percaya mencetak elemen-elemen dari array baris demi baris. Saya juga sudah memeriksa ini dengan:
echo $array_of_lines[1]
echo $array_of_lines[2]
...
Dalam upaya kedua, saya pikir menambahkan eval
dapat membantu:
IFS='\n' array_of_lines=$(eval my_command);
tapi saya mendapat hasil yang sama persis tanpa itu.
Akhirnya, mengikuti jawaban pada elemen Daftar dengan spasi di zsh , saya juga mencoba menggunakan flag ekspansi parameter alih-alih IFS
memberi tahu zsh cara membagi input dan mengumpulkan elemen menjadi array, yaitu:
array_of_lines=("${(@f)$(my_command)}");
Tapi saya masih mendapat hasil yang sama (splitting terjadi pada n
)
Dengan ini, saya punya pertanyaan berikut:
Q1. Apa cara "yang tepat" untuk mengumpulkan output dari perintah dalam array baris?
Q2. Bagaimana saya dapat menentukan IFS
untuk membagi pada baris baru saja?
Q3. Jika saya menggunakan flag ekspansi parameter seperti pada upaya ketiga saya di atas (yaitu menggunakan @f
) untuk menentukan pemisahan, apakah zsh mengabaikan nilai IFS
? Mengapa itu tidak berhasil?
sumber
"${(@f)...}"
sama dengan${(f)"..."}
, tetapi dengan cara yang berbeda.(@)
di dalam tanda kutip ganda berarti "menghasilkan satu kata per elemen array" dan(f)
berarti "dibagi menjadi array dengan baris baru". PS: Tolong tautkan ke dokumen${(f)"..."}
akan melewatkan garis kosong,"${(@f)...}"
melestarikannya. Itu perbedaan yang sama antara$argv
dan"$argv[@]"
. Benda itu"$@"
untuk melestarikan semua elemen array berasal dari cangkang Bourne pada akhir 70-an.Dua masalah: pertama, tampaknya tanda kutip ganda juga tidak menafsirkan lolos backslash (maaf tentang itu :). Gunakan
$'...'
tanda kutip. Dan menurutman zshparam
, untuk mengumpulkan kata-kata dalam array Anda harus melampirkannya dalam tanda kurung. Jadi ini bekerja:Saya tidak bisa menjawab Q3 Anda. Saya harap saya tidak akan pernah tahu hal-hal esoterik seperti ini :).
sumber
Anda juga dapat menggunakan tr untuk mengganti baris baru dengan spasi:
sumber
$IFS
. Menerjemahkan satu ke yang lain tidak ada bedanya.echo
, di mana input semua lebih atau kurang tumpukan kata yang dipisahkan oleh siapa yang peduli.