2013-04-09 39 views
10

Tôi đang cố gắng thực hiện điều này mà không cần thêm mã bổ sung, chẳng hạn như mã khác cho vòng lặp. Tôi có thể tạo ra logic tích cực của việc so sánh một chuỗi với một mảng. Mặc dù tôi muốn logic âm và chỉ in các giá trị không có trong mảng, về cơ bản đây là lọc các tài khoản hệ thống.Trong Bash, làm thế nào để bạn thấy nếu một chuỗi không nằm trong một mảng?

thư mục My có tập tin trong nó như thế này:

admin.user.xml 
news-lo.user.xml 
system.user.xml 
campus-lo.user.xml 
welcome-lo.user.xml 

Đây là mã tôi đã sử dụng để làm một trận đấu tích cực nếu tập tin đó là trong thư mục:

#!/bin/bash 

accounts=(guest admin power_user developer analyst system) 

for file in user/*; do 

    temp=${file%.user.xml} 
    account=${temp#user/} 
    if [[ ${accounts[*]} =~ "$account" ]] 
    then 
     echo "worked $account"; 
    fi 
done 

Bất kỳ sự giúp đỡ trong đúng hướng sẽ được đánh giá cao, cảm ơn.

+1

Bạn có thể có nghĩa là 'cho tệp trong người dùng/*; do' (lưu ý ';') – devnull

+0

Cảm ơn, có ai đó đã chỉnh sửa câu hỏi của tôi và vô tình xóa trả lại hàng. – blamonet

Trả lời

13

Bạn có thể phủ nhận kết quả của trận đấu tích cực:

if ! [[ ${accounts[*]} =~ "$account" ]] 

hoặc

if [[ ! ${accounts[*]} =~ "$account" ]] 

Tuy nhiên, thông báo rằng nếu $account bằng "người sử dụng", bạn sẽ nhận được một trận đấu, vì nó phù hợp một chuỗi con của "power_user". Tốt nhất là lặp lại một cách rõ ràng:

match=0 
for acc in "${accounts[@]}"; do 
    if [[ $acc = "$account" ]]; 
     match=1 
     break 
    fi 
done 
if [[ $match = 0 ]]; then 
    echo "No match found" 
fi 
+0

Tôi đã chỉnh sửa câu hỏi ban đầu của mình, cảm ơn vì đã làm rõ. – blamonet

+0

Rất tiếc, tôi không đọc kỹ câu hỏi của bạn. Tôi đã chỉnh sửa điều này để thực sự trả lời câu hỏi của bạn ngay bây giờ. – chepner

+0

Lời khuyên tuyệt vời, cảm ơn bạn. – blamonet

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