2012-04-29 13 views
6

मैं एक if/then कथन करने का प्रयास कर रहा हूं, जहां ls | grep something कमांड से गैर-खाली आउटपुट है तो मैं कुछ कथन निष्पादित करना चाहता हूं। मुझे सिंटैक्स नहीं पता है जिसका उपयोग करना चाहिए। मैं इस के कई रूप की कोशिश की है:बैश खोल 'if` कमांड कुछ देता है' तो कुछ

if [[ `ls | grep log ` ]]; then echo "there are files of type log"; 
+0

वैसे भी, अगर तुम यह सब एक साथ रखा, तो आप निम्न आदेश के साथ समाप्त http://mywiki.wooledge.org/BashFAQ/004 ("मैं कैसे जांच सकता हूं कि कोई निर्देशिका खाली है या नहीं? मैं किसी भी * .mpg फ़ाइलों या देश की जांच कैसे करूं टी कितने हैं? ") हाथ में तत्काल मुद्दे के लिए कुछ हद तक प्रासंगिक है। –

उत्तर

18

ठीक है, कि पास है, लेकिन आप fi साथ if खत्म करने के लिए की जरूरत है।

इसके अलावा, if बस एक आदेश चलाता है और आदेश सफल होता है (स्थिति कोड 0 से बाहर निकलता है), जो grep केवल तभी होता है जब इसे कम से कम एक मैच मिल जाए। आप उत्पादन की जांच की जरूरत नहीं है तो:

if ls | grep -q log; then echo "there are files of type log"; fi 

आप grep के एक पुराने या गैर जीएनयू संस्करण के साथ एक प्रणाली है कि -q ("शांत") विकल्प का समर्थन नहीं करता पर हैं, तो आप /dev/null को इसके उत्पादन पुनः निर्देशित द्वारा एक ही परिणाम प्राप्त कर सकते हैं:

if ls | grep log >/dev/null; then echo "there are files of type log"; fi 

लेकिन ls के बाद भी अशून्य रिटर्न अगर यह एक निर्दिष्ट फ़ाइल नहीं मिल रहा है, तो आप बिल्कुल grep बिना एक ही बात कर सकते हैं डी में के रूप में .Sawley का जवाब:

if ls *log* >&/dev/null; then echo "there are files of type log"; fi 

तुम भी भी ls के बिना, केवल खोल का उपयोग कर ऐसा कर सकते हैं, हालांकि यह थोड़ा wordier है: जब तक आप पार्टी विशेष रूप से उपयोग कर रहे हैं के रूप में

for f in *log*; do 
    # even if there are no matching files, the body of this loop will run once 
    # with $f set to the literal string "*log*", so make sure there's really 
    # a file there: 
    if [ -e "$f" ]; then 
    echo "there are files of type log" 
    break 
    fi 
done 

, आपको लगता है कि आसान बनाने के लिए nullglob विकल्प सेट कर सकते हैं कुछ हद तक:

shopt -s nullglob 
for f in *log*; do 
    echo "There are files of type log" 
    break 
done 
+0

धन्यवाद - यह जगह पर है। –

1

if में निर्मित एक शेल कमांड निष्पादित करता है और आदेश की वापसी मूल्य के आधार पर ब्लॉक का चयन करता है। ls एक अलग स्थिति कोड देता है अगर उसे अनुरोधित फाइलें नहीं मिलती हैं तो grep भाग की कोई आवश्यकता नहीं है। [[उपयोगिता वास्तव में बैश, आईआईआरसी से अंतर्निहित कमांड है, जो अंकगणितीय परिचालन करता है। मैं उस हिस्से में गलत हो सकता था क्योंकि मैं शायद ही कभी बोर्न शेल सिंटैक्स से भटक जाता हूं।

if ls *log* > /dev/null 2>&1 
then 
    echo "there are files of type log" 
fi 
+0

स्पष्टीकरण के लिए धन्यवाद, लेकिन मैं grep का उपयोग करने के बजाय सेट किया गया था। मैं कई नियमित अभिव्यक्ति नियमों के माध्यम से फ़िल्टर करना चाहता हूं, और शायद अन्य आदेशों से एलएस के अलावा आउटपुट फ़िल्टर कर सकता हूं। मैं एक उदाहरण के रूप में एलएस का उपयोग कर रहा था ताकि मेरे प्रारूप को हल करने से मुझे कई और समान आदेश लिखने की अनुमति मिल जाएगी। चीयर्स, ~) –

+1

@ बिलीमून - आप 'ls' के आउटपुट को grepping के बजाय' find' का उपयोग करने पर विचार करना चाहेंगे।यदि आप 'ls' का उपयोग करते हैं, तो पूर्ण पथ का उपयोग करें ताकि आप किसी के उपनाम' ls' से आश्चर्यचकित न हों। –

+0

@ डी। शॉली आप 'कमांड एलएस' का भी उपयोग कर सकते हैं, जो कमांड के विशिष्ट पथ के आधार पर दोनों उपनाम और कार्यों को छोड़ देता है। –

2

या if; then; fi बिना:

ls | grep -q log && echo 'there are files of type log' 

या भी:

ls *log* &>/dev/null && echo 'there are files of type log' 
+0

आपका मतलब '> &', '&>' नहीं है। –

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