2011-07-03 30 views
6

Tôi đang trong quá trình tạo tập lệnh bash sẽ liệt kê các tệp (trong trường hợp này là apache sites-available). Việc liệt kê các tệp dễ dàng bằng mục tiêu cuối cùng của tôi là đưa từng tệp đó vào một mảng, hiển thị chúng cho người dùng và cho phép người dùng chọn "tệp" nào để xử lý, trong trường hợp này nó sẽ là cho phép trang web đó.Tập lệnh Bash tạo một mảng từ ls?

tôi đã không nhận được rất xa, tôi biết tôi cần phải đặt ls như một mảng và sau đó lặp hành động:

array=$(ls) 
for sites in $array(2) 
do 
echo "$sites" 
done 

Tôi biết rằng tôi cần phải chỉ mỗi các tập tin trong thư mục và sau đó cho phép người dùng nhập số để bật. Vì vậy, nó sẽ trông như thế này:

(1) newdomain.com 
(2) newdomain2.com 

Which site would you like to enable (i.e 1)? 

Hy vọng điều đó có ý nghĩa?

Trả lời

6

Bạn có thể tiết kiệm cho mình rất nhiều việc thực hiện lại bằng cách sử dụng tính năng được xây dựng trong select.

Cấu trúc select cho phép tạo menu dễ dàng. Nó có hầu như cú pháp tương tự như lệnh for:

select name [in words ...]; do commands; done 

Danh sách các từ sau in được mở rộng, tạo ra một danh sách các mục. Tập hợp các từ mở rộng được in trên luồng đầu ra lỗi tiêu chuẩn, mỗi dòng đứng trước một số. Nếu bỏ qua in words, các tham số vị trí sẽ được in, như thể đã chỉ định in "[email protected]". Lời nhắc PS3 sau đó được hiển thị và một dòng được đọc từ đầu vào tiêu chuẩn. Nếu dòng bao gồm một số tương ứng với một trong các từ được hiển thị, thì giá trị của name được đặt thành từ đó. Nếu dòng trống, các từ và lời nhắc sẽ hiển thị lại. Nếu đọc EOF, lệnh select hoàn tất. Bất kỳ giá trị nào khác đọc gây ra name được đặt thành rỗng. Dòng đọc được lưu trong biến REPLY.

+0

Cảm ơn, tôi sẽ xem xét lệnh chọn. –

6

Đó không phải cách bạn sử dụng ls.

array=(*) 
+0

Điều đó hoạt động trong thư mục hiện tại, tuy nhiên tập lệnh có thể được gọi từ bất kỳ đâu vì vậy tôi sẽ phải xác định đường dẫn đầy đủ (tức là/etc/apache2/sites-available /). –

+0

Điều này khác với những gì bạn sẽ phải làm với 'ls' như thế nào? –

+1

Làm rõ: bạn cần một tập hợp các dấu ngoặc đơn để chỉ định một phép gán mảng, do đó, ở mức tối thiểu bạn sẽ cần phải nói 'mảng = ($ (ls bất cứ điều gì))'. Nếu không, bạn đang nhận được một chuỗi dài. – geekosaur

-1

một số gợi ý để giúp bạn bắt đầu:

APACHE_CONF=/etc/apache2 
SITES_TO_ENABLE="site1.org | site2.com" 
LIST_AVAILABLE=$(ls $APACHE_CONF/sites-available) 
LIST_ENABLED=$(ls $APACHE_CONF/sites-enabled) 

for site in $(echo $SITES_TO_ENABLE | sed -e "s/|//g") 
do 
    FOUND=$(echo $LIST_AVAILABLE | sed -e "s/ /\n/g" | egrep $site) 
    [[ ! -z $FOUND ]] && echo "Checking availability of $site: Ok" 
    [[ -z $FOUND ]] && echo "Checking availability of $site: Nok, site \"$site\" required for production has not been found or is not defined" && exit 1 
done 

Bạn có thể kết hợp phương pháp này với chọn tất nhiên.

+0

Điều này chỉ hoạt động cho đến khi một tệp trong một trong các thư mục chứa một dấu cách trong tên của nó hoặc ký tự đại diện hoặc bất kỳ thứ gì khác không thể in hoặc tìm thấy bên trong 'IFS'. Xem thêm http: //mywiki.wooledge.org/ParsingLs –

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