2012-11-13 9 views
6

के साथ एक बहस की स्थापना मैं अक्सर एक सरल बैश कमांड चलाएँ:बैश

rpm -Uvh --define "_transaction_color 3" myPackage.rpm 

जो ठीक से काम करता है।

लेकिन अब मैं एक बैश फ़ाइल में स्क्रिप्ट कोशिश कर रहा हूँ, और यह अधिक लचीला बनाने:

error: Macro % has illegal name (%define) 

त्रुटि आ रहा है:

#!/bin/bash 
INSTALL_CMD=rpm 
INSTALL_OPT="-Uvh --define '_transaction_color 3'" 

${INSTALL_CMD} ${INSTALL_OPT} myPackage.rpm 

हालांकि, इस त्रुटि पैदा रहता है --define से और उद्धृत _transaction_color को संभाला जाता है।
मैंने INSTALL_OPT एक सरणी बनाने के लिए विभिन्न प्रकार की भागने, अलग-अलग वाक्यांशों की कोशिश की है, ${INSTALL_OPT[@]} के साथ संभाला है।

अभी तक, मेरे प्रयासों ने काम नहीं किया है।
स्पष्ट रूप से, मैं जो चाहता हूं वह बेहद सरल है। मुझे यकीन नहीं है कि इसे कैसे पूरा किया जाए।

मैं अपने --define तर्क को ठीक से संभालने के लिए कैसे बाश प्राप्त कर सकता हूं?

+0

आप 'INSTALL_OPT = 'की कोशिश की है - Uvh --define _transaction_color 3'', है ना? –

+0

@ सैम्पसन-चेन: कोशिश की। "त्रुटि: मैक्रो% _transaction_color खाली शरीर है"। – abelenky

+0

ऐसा इसलिए है क्योंकि बैश आपके तर्कों को '-उवीएच' और '--define' और' _transaction_color' और '3'' 'के रूप में पढ़ता है। आपको ** इस मामले में एक सरणी का उपयोग करना होगा (जैसा कि बाड़मेर के उत्तर में नीचे दिखाया गया है): 'INSTALL_OPT = (- Uvh --define '_transaction_color 3')'। फिर '$ {INSTALL_CMD}" $ {INSTALL_OPT [$ @]} "myPackage.rpm' काम करता है (डबल कोट्स के साथ, जैसा कि उन्होंने उल्लेख किया है)। –

उत्तर

11

समस्या यह है कि परिवर्तनीय प्रतिस्थापन के बाद उद्धरण संसाधित नहीं किए जाते हैं। तो ऐसा लगता है कि आप '_transaction_color नामक मैक्रो को परिभाषित करने का प्रयास कर रहे हैं।

एक सरणी का उपयोग करके देखें:

INSTALL_OPT=(-Uvh --define '_transaction_color 3') 

तो:

"$INSTALL_CMD" "${INSTALL_OPT[@]}" myPackage.rpm 

यह डबल कोट के अंदर हो ${INSTALL_OPT[@]} डाल करने के लिए requoting प्राप्त करने के लिए महत्वपूर्ण है।

+1

'eval' बुराई है! –

+0

यदि आप अपनी पोस्ट संपादित करते हैं और 'बुराई' चीज़ को हटाते हैं तो मैं केवल '1' होगा। यह भयंकर है! बस सरणी के साथ एक छोड़ दो, क्योंकि यह एकमात्र अच्छी प्रथा है! –

+0

अगर आप अविश्वसनीय उपयोगकर्ता इनपुट का उपयोग कर रहे हैं तो Eval बुरा है। यदि आप इसे अपने डेटा से उपयोग कर रहे हैं, तो यह इतना बुरा नहीं है। सरणी उत्तर के लिए – Barmar

0

यह अंतरिक्ष पर शब्द बंटवारे के साथ एक पार्टी समस्या हो सकती है:

प्रयास करें:

#!/bin/bash 

IFS=$'\n' 

INSTALL_CMD=rpm 
INSTALL_OPT='-Uvh' 
INSTALL_OPT_DEFINE='--define _transaction_color 3' 

${INSTALL_CMD} ${INSTALL_OPT} ${INSTALL_OPT_DEFINE} myPackage.rpm 
+0

मुझे संदेह है कि '--define' को मैक्रो नाम और मान को एक ही तर्क में होना आवश्यक है, इसलिए यह काम नहीं करेगा। – Barmar

+0

@ बामार अच्छा बिंदु, मैं उस हिस्से के बारे में भी निश्चित नहीं था; मेरा जवाब अपडेट किया गया। –

+0

@ सैम्पसन-चेन: आईएफएस सेटिंग करने का प्रयास किया और जैसा कि आप वर्णन करते हैं विकल्पों को तोड़ना। परिणाम: "-उवीएच: अज्ञात विकल्प"। (मुझे समझ में नहीं आता क्यों ... लेकिन मुझे मिली त्रुटि है) – abelenky