2013-04-09 5 views
10

मैं अतिरिक्त कोड जोड़ने के बिना ऐसा करने की कोशिश कर रहा हूं, जैसे कि लूप के लिए दूसरा। मैं एक सरणी को एक स्ट्रिंग की तुलना करने का सकारात्मक तर्क बना सकता हूं। हालांकि मैं नकारात्मक तर्क और केवल प्रिंट मानों को सरणी में नहीं चाहता हूं, अनिवार्य रूप से यह सिस्टम खातों को फ़िल्टर करना है।बैश में आप कैसे देखते हैं कि कोई स्ट्रिंग सरणी में नहीं है या नहीं?

मेरे निर्देशिका इस तरह उसमें फ़ाइलें हैं:

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

इस कोड मैं अगर है कि फाइल निर्देशिका में है एक सकारात्मक मैच करने के लिए प्रयोग किया जाता है:

#!/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 

में कोई मदद सही दिशा की सराहना की जाएगी, धन्यवाद।

+1

शायद आप 'उपयोगकर्ता/* में फ़ाइल के लिए' थे; do' (ध्यान दें; ';') – devnull

+0

धन्यवाद, किसी ने मेरे प्रश्न पर एक संपादन किया और गलती से कैरिज रिटर्न हटा दिया। – blamonet

उत्तर

13

आप सकारात्मक मैच का नतीजा नकारना कर सकते हैं:

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

या

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

हालांकि, सूचना है कि अगर $account "उपयोगकर्ता" के बराबर होती है, तो आप एक मैच है, क्योंकि यह मेल खाता मिल जाएगा "power_user" का एक सबस्ट्रिंग। स्पष्ट रूप से पुन: प्रयास करना सबसे अच्छा है:

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

मैंने अपना मूल प्रश्न संपादित किया, स्पष्टीकरण के लिए धन्यवाद। – blamonet

+0

क्षमा करें, मैंने आपके प्रश्न को ध्यान से नहीं पढ़ा। मैंने इसे वास्तव में आपके प्रश्न का उत्तर देने के लिए संपादित किया है। – chepner

+0

महान सलाह, धन्यवाद। – blamonet

संबंधित मुद्दे

 संबंधित मुद्दे