का अर्थ "[: बहुत सारे तर्क" से त्रुटि [] (वर्ग कोष्ठक)


211

मुझे कोई भी सरल सीधा संसाधन नहीं मिल रहा है जो निम्नलिखित BASH शेल त्रुटि के लिए स्पेलिंग के अर्थ को ठीक करता है, इसलिए मैं इसे पोस्ट कर रहा हूं जो मैंने इसे शोध करने के बाद पाया।

त्रुटि:

-bash: [: too many arguments

Google के अनुकूल संस्करण bash open square bracket colon too many arguments :।

संदर्भ: यदि उदाहरण के लिए, समान तुलना में एक साधारण तुलना ऑपरेटर के साथ एकल वर्ग कोष्ठक में कोई शर्त, उदाहरण के लिए:

VARIABLE=$(/some/command);
if [ $VARIABLE == 0 ]; then
  # some action
fi 

1
वह कोड कहां है जिसने इस विशिष्ट त्रुटि का उत्पादन किया है?
एंडरसन ग्रीन

जवाबों:


353

यदि आपका $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)


एक और भी बेहतर तरीका हैi=$(some_command); i=$((i)); if [ "$i" == 0 ] ...
जो So

1
मुझे एक समस्या का सामना करना पड़ा, जहां टर्मिनल के माध्यम से बीएएस इंटरप्रेटर के रूप में बीएएसपी का उपयोग करने वाली एक शेलस्क्रिप्ट, ठीक चल रही थी, लेकिन जब क्रॉस्टैब के माध्यम से निष्पादित किया गया, तो इस तरह की विफलताएं हो रही थीं और पोस्टफ़िक्स के माध्यम से स्थानीय ईमेल भेजते हुए, इस त्रुटि को सूचित किया और मुझे पता चला, कि वहाँ था एक चर के लिए एक IF जिसमें विशेष वर्ण होते हैं। डबल कोट्स ने मेरी जान बचाई। धन्यवाद :)!
ivanleoncz

13

बस इस पोस्ट में टकरा गया, एक ही त्रुटि प्राप्त करके, परीक्षण करने की कोशिश कर रहा है कि क्या दो चर दोनों खाली (या गैर-खाली) हैं। यह एक यौगिक तुलना निकला - 7.3। अन्य तुलना ऑपरेटर - उन्नत बैश-स्क्रिप्टिंग गाइड ; और मुझे लगा कि मुझे निम्नलिखित नोट करना चाहिए:

  • मैं -eसोचता था कि इसका मतलब है "खाली" पहले; लेकिन इसका मतलब है कि "फ़ाइल मौजूद है" - -zखाली चर (स्ट्रिंग) के परीक्षण के लिए उपयोग करें
  • स्ट्रिंग चर को उद्धृत करने की आवश्यकता है
  • यौगिक तार्किक और तुलना के लिए, या तो:
    • दो testएस का उपयोग करें और &&उन्हें:[ ... ] && [ ... ]
    • या -aएक ही में ऑपरेटर का उपयोग करें test:[ ... -a ... ]

यहां एक वर्किंग कमांड है (निर्देशिका में सभी txt फ़ाइलों के माध्यम से खोज, और उन लोगों को डंप करना जो grepदोनों शब्दों को शामिल करते हैं):

find /usr/share/doc -name '*.txt' | while read file; do \
  a1=$(grep -H "description" $file); \
  a2=$(grep -H "changes" $file); \
  [ ! -z "$a1" -a ! -z "$a2"  ] && echo -e "$a1 \n $a2" ; \
done

12 अगस्त 2013 को संपादित करें: संबंधित समस्या नोट:

ध्यान दें कि क्लासिक test(एकल वर्ग ब्रैकेट [) के साथ स्ट्रिंग समानता की जांच करते समय , आपके पास "बराबर है" ऑपरेटर के बीच एक स्थान होना चाहिए , जो इस मामले में एक एकल "बराबर" =संकेत है (हालांकि दो बराबर के संकेत ==समानता के रूप में स्वीकार किए जाते हैं। ऑपरेटर भी)। इस प्रकार, यह विफल (चुपचाप):

$ if [ "1"=="" ] ; then echo A; else echo B; fi 
A
$ if [ "1"="" ] ; then echo A; else echo B; fi 
A
$ if [ "1"="" ] && [ "1"="1" ] ; then echo A; else echo B; fi 
A
$ if [ "1"=="" ] && [ "1"=="1" ] ; then echo A; else echo B; fi 
A

... लेकिन स्थान जोड़ें - और सब अच्छा लग रहा है:

$ if [ "1" = "" ] ; then echo A; else echo B; fi 
B
$ if [ "1" == "" ] ; then echo A; else echo B; fi 
B
$ if [ "1" = "" -a "1" = "1" ] ; then echo A; else echo B; fi 
B
$ if [ "1" == "" -a "1" == "1" ] ; then echo A; else echo B; fi 
B

क्या आप एक बश खोल उदाहरण प्रदान कर सकते हैं ((A || B) && C)?
jww

कृपया प्रश्न देखें 3826425 और 14964805
splaisan

यह वास्तव में एक उत्तर के लिए उपयोगी नहीं है क्योंकि यह आपको यह नहीं दिखाता है कि कमांड को पूरी तरह से वर्गाकार कोष्ठकों के भीतर कैसे समाहित किया जाए, जिसकी आवश्यकता है यदि उदाहरण के लिए एक लूप है।
तीमुथियुस स्वान

5

एक अन्य परिदृश्य जिसे आप प्राप्त कर सकते हैं [: too many argumentsया [: a: binary operator expectedत्रुटियां हैं यदि आप सभी तर्कों के लिए परीक्षण करने का प्रयास करते हैं"$@"

if [ -z "$@" ]
then
    echo "Argument required."
fi

यह सही ढंग से काम करता है अगर आप फोन करते हैं foo.shया foo.sh arg1। लेकिन अगर आप कई तरह के अर्गल्स पास करते हैं foo.sh arg1 arg2, तो आपको त्रुटियाँ मिलेंगी। इसका कारण यह है कि इसका विस्तार किया जा रहा है [ -z arg1 arg2 ], जो एक मान्य वाक्यविन्यास नहीं है।

तर्कों के अस्तित्व की जाँच करने का सही तरीका है [ "$#" -eq 0 ]। ( $#तर्कों की संख्या है)।


2

कुछ बार यदि आप गलती से कीबोर्ड को छूते हैं और एक स्थान हटा देते हैं।

if [ "$myvar" = "something"]; then
    do something
fi

इस त्रुटि संदेश को ट्रिगर करेगा। The] ’से पहले स्पेस पर ध्यान दें।


1
मुझे लगता है कि एक अलग वाक्यविन्यास त्रुटि का परिणाम है, जैसे: लाइन 21: [: लापता `] '
जो होलोवे

1

मुझे अपनी स्क्रिप्ट के साथ भी यही समस्या थी। लेकिन जब मैंने कुछ संशोधन किए तो यह मेरे लिए काम कर गया। मुझे यह पसंद आया: -

export k=$(date "+%k");
if [ $k -ge 16 ] 
    then exit 0; 
else 
    echo "good job for nothing"; 
fi;

इस तरह मैंने अपनी समस्या का समाधान किया। आशा है कि आपके लिए भी मदद करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.