2011-09-06 11 views
13

एक जीएनयू मेकफ़ाइल में, मैं आउटपुट वैरिएबल को एक मान में सेट करना चाहता हूं (चलिए एक "सत्य") इनपुट करते हैं परिवर्तनीय दो मानों में से एक के बराबर है और जब यह नहीं है तो एक अन्य मान ("झूठा") है।यह जांचने के लिए कि क्या एक चर दो मानों में से एक के बराबर है यदि///और

धन्यवाद this SO answer को मैं and और or कार्यों के बारे में सीखा है और जल्द ही उस के बाद मैं if समारोह मिल गया है। ये कार्य मेरे संस्करण के संस्करण में उपलब्ध प्रतीत होते हैं, इसलिए मैं उनका उपयोग करना चाहता हूं। ,

TEST_INPUT = `hostname` 
TEST_OUTPUT = $(if $(or $(eq $(TEST_INPUT),hal9000), 
         $(eq $(TEST_INPUT),pipboy)),true,false) 

दुर्भाग्य से मैं नहीं कर सकता क्योंकि मैं उम्मीद eq समारोह के किसी भी स्पष्ट रूप नहीं पा सके: मैं ऐसा ही कुछ लिखने के लिए करना चाहते हैं। मैं प्राप्त करने के लिए मैं क्या filter फ़ंक्शन का उपयोग करना चाहते हैं कर रहा हूँ:

TRUE_HOSTS = hal9000 pipboy 
TEST_OUTPUT = $(if $(filter $(TEST_INPUT),$(TRUE_HOSTS)),true,false) 

या subst समारोह:

TEST_OUTPUT = $(if $(and $(subst hal9000,,$(TEST_INPUT)), 
         $(subst pipboy,,$(TEST_INPUT))), 
        false,true) 

लेकिन मेरे लिए यह एक अच्छा लग रही है और न ही पठनीय कोड नहीं है। क्या पहले उदाहरण के करीब समाधान हैं (कोई मौजूदा eq फ़ंक्शन का उपयोग नहीं कर रहा है)? शायद मुझे if, and और or फ़ंक्शंस का उद्देश्य नहीं मिला है?

उत्तर

18

जीएनयूमेक सशर्त के बारे में अजीब चीज यह है कि बनाने में कोई बूलियन प्रकार नहीं है - सबकुछ एक स्ट्रिंग है। तो सशर्त सभी 'झूठी' और सभी गैर-खाली स्ट्रिंग को 'सत्य' के रूप में खाली स्ट्रिंग के साथ काम करते हैं।

कहा जा रहा है कि तथ्य यह है कि eq गुम है, हालांकि एक नाबालिग एक यद्यपि है। आम तौर पर आप filter या findstring से प्राप्त कर सकते हैं, और filter अक्सर आपको अपने दूसरे उदाहरण के रूप में मिलान करने के लिए तारों की पूरी सूची खोजने की अनुमति देता है। ,

eq = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1))) 

जो तुम दुर्भाग्य $(call eq, के रूप में उपयोग करने के लिए है ... , ... )

+0

मेरी भावना की पुष्टि करने के लिए धन्यवाद कि तुलनात्मक कार्य प्रदान नहीं किए जाते हैं। आपका 'eq' फ़ंक्शन भी बहुत स्मार्ट और मेरे समाधानों से अधिक पठनीय है (मैं लापरवाही से इसका उपयोग करूंगा)। धन्यवाद :) –

4

अपने संदर्भ पर निर्भर:

तुम सच में की जरूरत है, आप अपने खुद के eq समारोह को परिभाषित कर सकते जीएमएसएल (जीएनयू मेक स्टैंडर्ड लाइब्रेरी) का उपयोग करने पर विचार करें, जो कि मेक में फ़ंक्शंस का संग्रह है "... जो सूची और स्ट्रिंग मैनिपुलेशन, पूर्णांक अंकगणित, सहयोगी सरणी, ढेर और डिबगिंग सुविधाएं प्रदान करता है।" के लिए

TEST_INPUT = $(shell hostname -s) 
    TEST_OUTPUT = $(if $(or $(call seq,$(TEST_INPUT),hal9000), 
          $(call seq,$(TEST_INPUT),pipboy)),true,false) 

इसके अलावा, $ का उपयोग करें (खोल ...) बैकटिक के बजाय वाक्य रचना: देखें http://gmsl.sourceforge.net/

यह एक "स्ट्रिंग बराबर" समारोह, seq, साथ ही अन्य उपयोगी manipulators की एक संख्या है न्यूलाइन की बेहतर हैंडलिंग।

7

क्रिस डोड का जवाब अच्छा है, लेकिन एक कोने केस है जिसके लिए यह गलत परिणाम प्रदान करता है। यदि तुलना की जा रही दोनों चर खाली हैं (यानी झूठी) तो यह झूठी वापसी होगी। एक उन्नत संस्करण होगा:

eq = $(if $(or $(1),$(2)),$(and $(findstring $(1),$(2)),\ 
           $(findstring $(2),$(1))),1) 

यह पहली चेकों तर्कों की या तो खाली नहीं हैं को देखने के लिए, और उनकी तुलना करने के लिए यदि ऐसा है तो पिछले तकनीक का उपयोग करता।अन्यथा यह इंगित करने के लिए 1 लौटाता है कि मान बराबर हैं क्योंकि वे दोनों खाली हैं।

+1

या आप उस मामले से बच सकते हैं 'eq = $ (और $ (खोज $ x (1), x $ (2)), $ (खोज $ x (2), x $ (1)))। – akim

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