Tôi nghĩ rằng sau đây sẽ nhóm đầu ra của my_command
một loạt các dòng:
IFS='\n' array_of_lines=$(my_command);
vì vậy mà $array_of_lines[1]
sẽ đề cập đến dòng đầu tiên trong đầu ra của my_command
, $array_of_lines[2]
đến dòng thứ hai, v.v.
Tuy nhiên, lệnh trên dường như không hoạt động tốt. Nó dường như cũng phân chia đầu ra my_command
xung quanh ký tự n
, như tôi đã kiểm tra print -l $array_of_lines
, mà tôi tin rằng in các phần tử của một dòng theo từng dòng. Tôi cũng đã kiểm tra điều này với:
echo $array_of_lines[1]
echo $array_of_lines[2]
...
Trong lần thử thứ hai, tôi nghĩ việc thêm eval
có thể giúp:
IFS='\n' array_of_lines=$(eval my_command);
nhưng tôi đã nhận được kết quả chính xác như không có nó.
Cuối cùng, sau câu trả lời trên các phần tử List có khoảng trắng trong zsh , tôi cũng đã thử sử dụng các cờ mở rộng tham số thay vì IFS
nói cho zsh cách chia đầu vào và thu thập các phần tử thành một mảng, tức là:
array_of_lines=("${(@f)$(my_command)}");
Nhưng tôi vẫn nhận được kết quả tương tự (chia tách xảy ra trên n
)
Với điều này, tôi có các câu hỏi sau đây:
Q1. Các cách "thích hợp" để thu thập đầu ra của lệnh trong một mảng các dòng là gì?
Quý 2 Làm thế nào tôi có thể chỉ định IFS
để phân chia trên dòng mới?
H3. Nếu tôi sử dụng cờ mở rộng tham số như trong lần thử thứ ba ở trên (tức là sử dụng @f
) để chỉ định chia tách, zsh có bỏ qua giá trị của IFS
không? Tại sao nó không hoạt động ở trên?
"${(@f)...}"
là giống như${(f)"..."}
, nhưng theo một cách khác.(@)
bên trong dấu ngoặc kép có nghĩa là năng suất của một từ trên mỗi phần tử mảng và(f)
có nghĩa là cách chia thành một mảng bởi dòng mới. PS: Vui lòng liên kết đến các tài liệu