2012-09-07 27 views
26

câu hỏi này không giống như Does the shell support sets?hiện linux shell hỗ trợ danh sách cấu trúc dữ liệu?

tôi biết rất nhiều cấu trúc danh sách hỗ trợ ngôn ngữ kịch bản, như python, python, ruby ​​và javascript, vậy còn vỏ linux thì sao?

trình bao hỗ trợ cú pháp như vậy?

for i in list: 
do 
    print i 
done 

đầu tiên tôi sẽ khởi tạo một danh sách, ví dụ:

ListName = [ item1, item2, ..., itemn ] 

sau đó lặp trên nó

là có thể khi lập trình kịch bản shell?

+1

Cũng lưu ý rằng vỏ Bourne/POSIX không có mảng. Nhưng 'cho mục trong danh sách các mục; Do' xây dựng chắc chắn được hỗ trợ trong tất cả các vỏ. Lưu ý cũng sử dụng thuận tiện của globbing để lặp qua một tập hợp các tập tin; 'cho tập tin trong một * .dat' xây dựng một danh sách các thẻ bằng cách mở rộng ký tự đại diện (mặc dù thật đáng buồn, nhiều người dùng quản lý để phá hoại nó bằng cách làm một cái gì đó như' cho tệp trong $ (ls a * .dat) '). – tripleee

Trả lời

45

Nó hỗ trợ danh sách, nhưng không phải là cấu trúc dữ liệu riêng biệt (bỏ qua mảng cho thời điểm này).

Các for lặp vòng lặp trên một danh sách (theo nghĩa chung chung) của các giá trị màu trắng-không gian tách ra, bất kể như thế nào trong danh sách đó được tạo ra, cho dù theo nghĩa đen:

for i in 1 2 3; do 
    echo "$i" 
done 

hoặc thông qua việc mở rộng tham số:

listVar="1 2 3" 
for i in $listVar; do 
    echo "$i" 
done 

hoặc lệnh thay:

for i in $(echo 1; echo 2; echo 3); do 
    echo "$i" 
done 

Một ARRA y chỉ là một tham số đặc biệt có thể chứa danh sách giá trị có cấu trúc hơn, trong đó mỗi phần tử có thể chứa khoảng trắng. So sánh sự khác biệt:

array=("item 1" "item 2" "item 3") 
for i in "${array[@]}"; do # The quotes are necessary here 
    echo "$i" 
done 

list='"item 1" "item 2" "item 3"' 
for i in $list; do 
    echo $i 
done 
for i in "$list"; do 
    echo $i 
done 
for i in ${array[@]}; do 
    echo $i 
done 
+0

Ý nghĩa của @ là gì ?? –

+2

Đó là một chỉ mục đặc biệt làm cho việc mở rộng tạo ra tất cả các phần tử của mảng, không chỉ là một phần tử cụ thể. – chepner

+0

Tôi không hiểu tại sao 'for i in" $ {array [@]} ";' in 3 dòng. Vì 'echo $ {array [@]}' in một dòng duy nhất 'mục 1 mục 2 mục 3', tôi mong rằng' for i in "$ {array [@]}"; 'được chuyển đổi thành' for i in "mục 1 mục 2 mục 3"; '; do đó, nó sẽ dẫn đến một dòng 'mục 1 mục 2 mục 3'.Tôi đang thiếu gì? Cảm ơn trước – Svech87

7

Đối lập danh sách, bạn chỉ cần làm điều đó

colors=(red orange white "light gray") 

Về mặt kỹ thuật là một mảng, nhưng - dĩ nhiên - nó có tất cả các tính năng danh sách.
Ngay cả danh sách python được triển khai với mảng

+1

Để lặp qua mảng, sử dụng 'cho mục trong $ {colors [*]}; echo item $; done' – neevek

+8

@Neevek sẽ không làm những gì bạn nghĩ; "màu xám nhạt" sẽ được coi là hai mục "ánh sáng" và "màu xám". Bạn cần sử dụng '" $ {colors [@]} "' ('@' không '*' và được trích dẫn). – chepner

+0

tại sao "màu xám nhạt" sẽ được coi là hai mục khi * được sử dụng? nơi tôi có thể tìm thấy tài liệu cho các chi tiết như vậy? người đàn ông sh? – hugemeow

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