उत्तर के पुराने संस्करण के लिए, इस उत्तर का दूसरा भाग देखें। यदि आप विवरण के बारे में जानना चाहते हैं, तो पढ़ें
मुद्दे का कारण
प्रश्न में ही, यह बताया जाता है कि ओपी देखता है 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 ( स्टीफन चेज़लस के अनुसार ), यह ध्वज दोषपूर्ण है।
यह भी देखें