2012-06-04 27 views
14

Im làm việc trong ZSH, nhưng chắc chắn rằng các hướng dẫn BASH có thể sẽ giúp ích. Tôi cần phải có một vòng lặp for mà đi qua các giá trị được lưu trữ trong mảng lw và sau đó khởi chạy một kịch bản shell, dựa trên tên được lưu trữ trong mảng.ZSH cho vấn đề biến mảng vòng lặp

Cho đến nay, đây là những gì tôi đã đưa ra:

$lw=('plugin1' 'plugin2' 'plugin3') 

for i in $lw; 
    do . ~/Library/Rogall/plugins/$lw[$i]/lw.prg end; 
done 

nó chỉ mang lại cho tôi một lỗi khi chạy nói rằng nó không thể tìm thấy ~/Library/Rogall/plugins // lw. prg, do đó, nó xuất hiện của nó chỉ bỏ qua biến của tôi tất cả togethor.

Bất kỳ ý tưởng nào mà tôi đã nhầm lẫn?

+1

Hãy thử 'echo $ i' để xem những gì Nó chứa. –

Trả lời

26

Nó thực sự đơn giản hơn nhiều so với:

lw=('plugin1' 'plugin2' 'plugin3') 

for i in $lw; do 
    . ~/Library/Rogall/plugins/$i/lw.prg end 
done 

Nói tóm lại:

  • Assign để "foo", không phải "$ foo" (vỏ sẽ cố gắng mở rộng $ foo và gán cho bất cứ điều gì nó mở rộng, thường không hữu ích)
  • Sử dụng biến vòng lặp trực tiếp; nó chứa giá trị mảng chứ không phải là chỉ số
+0

Điều đó có ý nghĩa rất nhiều! Cảm ơn bạn! – user1296965

+0

Hoặc chỉ 'cho tôi ($ lw). ~/Library/Rogall/plugins/$ i/lw.prg end' –

+1

Không phải trong trường hợp chung, 'for i in $ array' sẽ bỏ qua các phần tử rỗng. Bạn sẽ cần 'for i in" $ array [@] "' hoặc 'cho i trong" $ {(@) array} "' để giữ lại những cái trống (hoặc cú pháp tương thích ksh/bash: 'for i in "$ {mảng [@]}" '). –

13

Tại sao bận tâm sử dụng mảng? Điều này có thể được thực hiện trong sh di động rất dễ dàng:

lw='plugin1 plugin2 plugin3' 

for i in $lw; 
    do . ~/Library/Rogall/plugins/$i/lw.prg end 
done 

Lưu ý rằng để làm việc này trong zsh, bạn cần phải thực hiện zsh làm điều đúng với: set -o shwordsplit

+0

Thậm chí còn to hơn. Cảm ơn. – user1296965

+1

Không phải tất cả mọi thứ là về di động như có thể được, đặc biệt là nếu nó được chạy trên máy Mac (đánh giá bằng tên thư mục). Ngoài ra giải pháp của bạn không thành công cho trường hợp chung mà trong đó có thể có dấu cách trong mỗi từ. –

+0

@Moritz Đây không phải là một trường hợp chung chung, nhưng một trường hợp cụ thể trong đó không có không gian trong tên tập tin. Tính di động có thể không phải lúc nào cũng cần thiết, nhưng nó luôn là mục tiêu mong muốn. Và giải pháp này hoạt động tốt trên máy Mac. –

Các vấn đề liên quan