अगर $ 1 और $ 2 शून्य हैं तो कैसे जांचें?


40

मैं कुछ स्क्रिप्ट चला रहा हूं जो स्ट्रिंग तर्क पास कर रहा है और मैं करना चाहता हूं यदि नीचे दिए गए अन्य विवरण दिखाए गए हैं:

if [ $1 != '' ] && [ $2 != '' ]
then 
    do something.....

लेकिन यह दिखाया गया है Error too many argument। क्यूं कर?


आपको 1. आदेश देना चाहिए जिसे आप स्क्रिप्ट कहते हैं और 2. पूर्ण आउटपुट।
लुसियो

2
आपको उपयोग करना चाहिए [[ ]]। अन्यथा आपको अपने चरों को उद्धृत करना होगा।
क्रिस्टोफ डे ट्रॉयर

यदि $ 1 मौजूद नहीं था, तो $ 2 $ 1 बन जाएगा, जो $ 1 और $ 2 का परीक्षण करता है, दोनों अशक्त प्रतीत होते हैं।
विनयुनुच्स 2 यूनिक्स

@ WinEunuuchs2Unix जरूरी नहीं है अप्रासंगिक - कुछ मामलों में आप यह सुनिश्चित करना चाहते हैं कि तर्कों में रिक्त या अशक्त स्ट्रिंग के बजाय वास्तव में कुछ है। $1स्क्रिप्ट के उपयोगकर्ता द्वारा अशक्त या अशक्त करने के लिए सेट किया जा सकता है। कमांड के इस क्रम पर विचार करें: $ set '' barफिर echo "x${1}x";दोनों चर निर्धारित किए जाते हैं, लेकिन उनमें से एक शून्य है।
सर्गी कोलोडियाज़नी

जवाबों:


55

-Z परीक्षण का उपयोग करने का प्रयास करें:

if [ -z "$1" ] && [ -z "$2" ]

आदमी से bash:

-z string
   True if the length of string is zero.

इससे मेरा काम बनता है!
पेंगिसगूड

यह दिलचस्प है कि सबसे अधिक मतदान और स्वीकृत उत्तर वास्तव में पूछे गए प्रश्न का उत्तर नहीं देता है ।
मीम

पोर्टेबल शेल स्क्रिप्ट लिखते समय, इस ध्वज का उपयोग सावधानी से किया जाना चाहिए, क्योंकि कुछ वाणिज्यिक यूनिक्स पर यह ध्वज दोषपूर्ण है। जुड़े स्रोतों के लिए मेरा जवाब देखें।
सर्गी कोलोडियाज़नी

14

चूंकि यह टैग किया गया है bash, मैं सुझाव देता हूं कि एक विस्तारित परीक्षण निर्माण ( [[...]]) का उपयोग करें , और उद्धरण भूल जाएं:

if [[ -z $1 && -z $2 ]]; then
...

जब तक आप sh/ POSIX संगतता के लिए नहीं जा रहे हैं , तब तक उपयोग न करने का कोई कारण नहीं है [[ ]]


3

निम्नलिखित भी काम करता है,

if [ "$1" == "" && "$2" == ""]; then
    echo NULL
fi

&&और अन्य तार्किक आदेश विभाजक क्लासिक में अनुमति नहीं है test। आपको इसके बजाय अन्य परीक्षण निर्माणों का उपयोग करना होगा (जैसे -a, मुझे लगता है)
muru

3

उत्तर के पुराने संस्करण के लिए, इस उत्तर का दूसरा भाग देखें। यदि आप विवरण के बारे में जानना चाहते हैं, तो पढ़ें

मुद्दे का कारण

प्रश्न में ही, यह बताया जाता है कि ओपी देखता है too many arguments error, जब परीक्षण किया जाता bashहै तो ऐसा प्रतीत नहीं होता है:

$ [ $1 != '' ] && [ $2 != '' ]
bash: [: !=: unary operator expected

/bin/shजिसके साथ वास्तव में /bin/dashउबंटू पर सहानुभूति है , त्रुटि इस प्रकार है:

$ sh
$ [ $1 != '' ] && [ $2 != '' ]
sh: 1: [: !=: unexpected operator

और स्टैंडअलोन /bin/testभी:

$ /usr/bin/test $1 != ''  
/usr/bin/test: missing argument after ‘’

सिडेनोट: यदि आप सोच रहे हैं /usr/bin/testकि मैं क्या और क्यों उपयोग कर रहा हूं bashऔर shफिर, आपको पता होना चाहिए कि कमांड के [लिए उपनाम है test, जो स्टैंडअलोन निष्पादन योग्य या अधिक सामान्यतः के रूप में मौजूद है - शेल निर्मित-जिसमें प्रत्येक शेल पहले उपयोग करेगा। । ifकथनों के अनुसार, वे आज्ञाओं के निकास प्रतिमाओं पर काम करते हैं, इसलिए क्यों [और testआज्ञाएँ हैं, बाकी सब कुछ उस आज्ञा के तर्क के रूप में है - उन आदेश-पंक्ति आर्ग के अनुचित आदेश में त्रुटियां होती हैं।

विषय पर वापस जाएं: यह अस्पष्ट है कि ओपी को असंबंधित त्रुटि कैसे मिली। हालाँकि, सभी 3 मामलों में समस्या समान है - परेशान चर को खाली माना जाएगा, इस प्रकार शेल इन अयोग्य चर के साथ क्या देखता है

[ != '' ]

जो वाक्यविन्यास को तोड़ता है जो testसमझता है। याद रखें कि मैंने कमांड-लाइन तर्कों के अनुचित आदेश के बारे में क्या कहा था? इसलिए उद्धृत करना महत्वपूर्ण क्यों है। आइए नैदानिक ​​उत्पादन को सक्षम करें और देखें कि शेल क्या निष्पादित करता है:

$ set -x
# throws error
$ [ $1 != '' ] && [ $2 != '' ] 
+ '[' '!=' '' ']'
bash: [: !=: unary operator expected
# no error
$ [ "$1" != '' ] && [ "$2" != '' ] || echo null vars
+ '[' '' '!=' '' ']'
+ echo null vars
null vars

परेशान चर का परीक्षण करने का बेहतर तरीका

एक बहुत लगातार दृष्टिकोण जो आप चारों ओर देखते हैं वह यह है:

 if [ "x$var1" == "x"  ] && [ "x$var2" == "x"  ];                                                                
 then
     echo "both variables are null"
 fi

गिलेस को उद्धृत करने के लिए :

["X $ 1" = "x"] में, एक्स उपसर्ग सुनिश्चित करता है कि x "$ 1" संभवतः एक ऑपरेटर की तरह नहीं दिख सकता है, और इसलिए शेल इस परीक्षण को पार्स कर सकता है = बाइनरी ऑपरेटर के रूप में = उपचार करके।

मुमकिन है, यह काफी पोर्टेबल होना चाहिए क्योंकि मैंने इन्हें /bin/shस्क्रिप्ट में देखा है । यह भी के रूप में संयुक्त किया जा सकता है

if [ "x${var1}${var2}" == "x" ]; then
    ...
fi

बेशक, हम -zध्वज का उपयोग कर सकते हैं , हालांकि कुछ गोले में अनुसंधान के अनुसार, विशेष रूप से ksh88 ( स्टीफन चेज़लस के अनुसार ), यह ध्वज दोषपूर्ण है।

यह भी देखें


एक बहुत ही दिलचस्प दृष्टिकोण के लिए +1।
WinEunuuchs2Unix

@ WinEunuuchs2Unix ने इसे और भी दिलचस्प बनाने के लिए संपादित किया :)
सर्गी कोलोडियाज़नी

1

मुझे लगता है कि पोस्ट का शीर्षक सटीक नहीं है, क्योंकि संदेश में इरादा यह जांचना था कि क्या $ 1 और $ 2 शून्य नहीं हैं। दिए गए उदाहरण $ 1 और $ 2 में काम करने के लिए बस दोहरे उद्धरण चिह्नों को याद कर रहे थे। तार की तुलना करते समय चर का विस्तार किया जाना चाहिए। लेकिन, यह जांचने के लिए कि क्या $ 1 और $ 2 मौजूद है, अगर $ 2 मौजूद है, तो यह चेक के समान है, क्योंकि यदि $ 1 मौजूद नहीं है, तो यह मौजूद नहीं है। इस मामले में 'अगर' कमांड की भी जरूरत नहीं है, क्योंकि 'परीक्षण' सही / गलत है और 'और' का उपयोग करता है तो 'रिटर्न' 0 / true है:

[ "$2" != '' ] && commands...

सरल, एन-एन (नॉनजरो):

[ -n "$2" ] && commands...

"जाँचने के लिए कि क्या $ 1 और $ 2 अशक्त हैं" चेक के समान होगा यदि कोई पैरामीटर नहीं है:

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