2011-03-11 10 views
12

मैं निम्नलिखित पंक्ति है एक बहुत बड़ा बैश स्क्रिप्ट के हिस्से के रूप:कमान के अंदर अगर बैश स्क्रिप्ट के बयान

if [ `packages/TinySVM-0.09/bin/svm_learn 2>&1| grep TinySVM | wc -l | cut -c0-7 | sed 's/^ *//g'` -eq 1 ] 
स्क्रिप्ट चलाने पर

, मैं मिलता है:

./install.sh : लाइन 21 9: [: -ईक्यू: यूनरी ऑपरेटर की उम्मीद

जहां लाइन 21 9 ऊपर की रेखा है। एक फिक्स के लिए कोई सुझाव?

उत्तर

22

ऐसा तब होता है जब आप [ के माध्यम से निर्मित किया गया है और आपकी बाएं तरफ अभिव्यक्ति एनयूएल लौटाती है। आप का उपयोग करके इसे ठीक कर सकते हैं:

if [ x`some | expression | here` = x1 ]; then 

या, के बाद से आप पहले से ही पार्टी का उपयोग कर रहे आप अपने बहुत अच्छे (()) सिंटैक्स का उपयोग कर सकते हैं जो इस समस्या नहीं है और कार्य करें:

if (($(some | expression | here) == 1)); then 

ध्यान दें कि मैं भी बैकटिक से अधिक आदेश प्रतिस्थापन के लिए $() इस्तेमाल किया `` के रूप में बाद के गैर POSIX है और

पदावनत
4

कोशिश करें [[test_expression]]; [test_expression] के बजाय;

8

त्रुटि तब होती है, क्योंकि अपने आदेश प्रतिस्थापन कुछ भी नहीं देता है प्रभावी रूप से बनाने की तरह अपने परीक्षण नज़र:

if [ -eq 1 ] 

एक आम तरीका है इसे ठीक करने के समीकरण के दोनों ओर पर कुछ निरंतर संलग्न करने के लिए है, इसलिए है कि कोई संकार्य हो जाता है किसी भी समय खाली:

if [ x`packages/TinySVM-0.09/bin/svm_learn 2>&1| grep TinySVM | wc -l | cut -c0-7 | sed 's/^ *//g'` = x1 ] 

ध्यान दें कि = किया जा रहा है अब हम तार तुलना कर रहे हैं के रूप में।

4

आप तुलना के दोनों पक्षों के लिए एक "x" जोड़ सकते हैं या यदि आप बस बाईं ओर बोली सकता है:

[ "$(command | pipeline)" = 1 ] 

मुझे समझ में नहीं आता कि cut और sed अंत में क्या हैं। पाइपलाइन में wc -l का आउटपुट बस एक संख्या है।

18

आप बिना किसी अतिरिक्त वाक्यविन्यास के अपना आदेश चला सकते हैं। उदाहरण के लिए, निम्नलिखित जांच ग्रेप के निकास कोड निर्धारित करने के लिए नियमित अभिव्यक्ति से मेल खाता है या नहीं:

if ! grep -q "$word" /usr/share/dict/words 
then 
    echo "Word $word is not valid word!" 
fi 
+1

है कि मैं के लिए ... – mmey

+0

क्या देख रहा था तो ऐसा कोई कारण इस तकनीक का प्रयोग करने के लिए नहीं है, क्योंकि यह है शायद ही कभी उल्लेख किया? –

+1

शायद मुझे खुद का कारण मिला: grep के साथ जो अच्छी तरह से काम करता है, लेकिन अन्य कमांड के साथ, जो आउटपुट sth हो सकता है। (और सिर्फ एक कोड वापस नहीं), यह आउटपुट stdout पर मुद्रित किया जाएगा। कमांड> और/dev/null के बारे में '' '' 'के बारे में क्या है; फिर ... '' '' ' –

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