यदि आपका $VARIABLE
एक स्ट्रिंग है जिसमें रिक्त स्थान या अन्य विशेष वर्ण हैं, और एकल वर्ग कोष्ठक का उपयोग किया जाता है (जो test
कमांड के लिए एक शॉर्टकट है ), तो स्ट्रिंग को कई शब्दों में विभाजित किया जा सकता है। इनमें से प्रत्येक को एक अलग तर्क के रूप में माना जाता है।
ताकि एक चर कई तर्कों में विभाजित हो जाए :
VARIABLE=$(/some/command);
# returns "hello world"
if [ $VARIABLE == 0 ]; then
# fails as if you wrote:
# if [ hello world == 0 ]
fi
वही किसी भी फ़ंक्शन कॉल के लिए सही होगा जो एक स्ट्रिंग रखता है जिसमें रिक्त स्थान या अन्य विशेष वर्ण होते हैं।
आसान तय
डबल आउटपुट में चर आउटपुट लपेटें, यह एक स्ट्रिंग (इसलिए एक तर्क) के रूप में रहने के लिए मजबूर करता है। उदाहरण के लिए,
VARIABLE=$(/some/command);
if [ "$VARIABLE" == 0 ]; then
# some action
fi
इतना ही आसान। लेकिन नीचे भी "सावधान रहें ..." छोड़ दें अगर आप भी गारंटी नहीं दे सकते हैं कि आपका वेरिएबल खाली स्ट्रिंग नहीं होगा, या एक स्ट्रिंग जिसमें व्हाट्सएप के अलावा कुछ नहीं होगा।
या, एक वैकल्पिक फिक्स डबल स्क्वायर ब्रैकेट (जो new test
कमांड के लिए एक शॉर्टकट है ) का उपयोग करना है।
हालांकि यह केवल बैश (और जाहिरा तौर पर korn और zsh) में मौजूद है, और इसलिए इसे डिफ़ॉल्ट गोले /bin/sh
आदि के साथ संगत नहीं किया जा सकता है ।
इसका मतलब है कि कुछ सिस्टम पर, यह कंसोल से काम कर सकता हैcron
, लेकिन जब सब कुछ कॉन्फ़िगर किया गया है, इसके आधार पर , जैसे कहीं और से नहीं बुलाया जाता है।
यह इस तरह दिखेगा:
VARIABLE=$(/some/command);
if [[ $VARIABLE == 0 ]]; then
# some action
fi
यदि आपकी कमांड में इस तरह के डबल वर्ग ब्रैकेट होते हैं और आपको लॉग में त्रुटियां मिलती हैं, लेकिन यह कंसोल से काम करता [[
है, तो यहां सुझाए गए विकल्प के लिए स्वैपिंग का प्रयास करें, या, यह सुनिश्चित करें कि जो भी आपकी स्क्रिप्ट चलाता है वह [[
उर्फ का समर्थन करने वाले शेल का उपयोग करता है new test
।
साथ ही [: unary operator expected
त्रुटि से सावधान रहें
यदि आप "बहुत सारे तर्क" त्रुटि देख रहे हैं, तो संभावना है कि आप अप्रत्याशित आउटपुट वाले फ़ंक्शन से स्ट्रिंग प्राप्त कर रहे हैं। यदि खाली स्ट्रिंग (या सभी व्हाट्सएप स्ट्रिंग) प्राप्त करना भी संभव है, तो इसे उपरोक्त "त्वरित फिक्स" के साथ भी शून्य तर्क माना जाएगा, और इसके साथ विफल होगा[: unary operator expected
यदि आप अन्य भाषाओं के लिए उपयोग किए जाते हैं, तो यह वही 'गोच' है - यदि आप मूल्यांकन किए जाने से पहले किसी चर की सामग्री को प्रभावी ढंग से कोड में मुद्रित करने की अपेक्षा नहीं करते हैं।
यहां एक उदाहरण है जो दोनों [: too many arguments
और [: unary operator expected
त्रुटियों को रोकता है : आउटपुट को डिफ़ॉल्ट मान के साथ प्रतिस्थापित करता है यदि यह खाली है (इस उदाहरण में 0
), पूरी चीजों के चारों ओर लिपटे दोहरे उद्धरणों के साथ:
VARIABLE=$(/some/command);
if [ "${VARIABLE:-0}" == 0 ]; then
# some action
fi
(यहां, यदि $ VARIABLE 0 या रिक्त है, तो कार्रवाई होगी। स्वाभाविक रूप से, आपको 0 (डिफ़ॉल्ट मान) को एक अलग डिफ़ॉल्ट मान में बदलना चाहिए यदि अलग-अलग व्यवहार चाहते हैं)
अंतिम नोट: चूंकि [
एक शॉर्टकट है test
, उपरोक्त सभी त्रुटि के लिए भी सही है test: too many arguments
(और भी test: unary operator expected
)