2010-03-01 13 views
33

मुझे यकीन नहीं है कि if को शैल में एकाधिक परीक्षणों के साथ कैसे करना है। मैं मुसीबत यह पटकथा लिख ​​रही:शैल स्क्रिप्ट्स में elif fi का उपयोग करना

./compare.sh: [: लापता `]

echo "You have provided the following arguments $arg1 $arg2 $arg3" 
if [ "$arg1" = "$arg2" && "$arg1" != "$arg3" ] 
then 
    echo "Two of the provided args are equal." 
    exit 3 
elif [ $arg1 = $arg2 && $arg1 = $arg3 ] 
then 
    echo "All of the specified args are equal" 
    exit 0 
else 
    echo "All of the specified args are different" 
    exit 4 
fi 

समस्या मैं यह त्रुटि हर समय मिलता है 'आदेश नहीं मिला

+5

काफी कुछ टिप्पणीकारों ने आपको सुझाव दिया है [[बल्कि [लेकिन यह आपकी स्क्रिप्ट बैश-विशिष्ट बनाता है। यदि आप सादे पुराने बोर्न शेल (श) सिंटैक्स से चिपके रह सकते हैं तो आपके पास कम रखरखाव और पोर्टेबिलिटी समस्याएं होंगी। –

उत्तर

25

sh एक खोल ऑपरेटर के रूप में && की व्याख्या कर रहा है। क्योंकि [ उलझन में हो जाता है जब आप तर्क को बंद रखना होगा,

[ "$arg1" = "$arg2" -a "$arg1" != "$arg3" ] 

इसके अलावा, आप हमेशा चर बोली चाहिए: यह -a के लिए परिवर्तित करें, कि [ के संयोजन के रूप ऑपरेटर है।

5

"[" से "[[" और "]" से "]]" बदलें।

+1

बेहतर अभी तक, '[' to 'test' –

7

डबल कोष्ठक का प्रयोग करें ...

if [[ expression ]]

+1

बदलें, यह एक समाधान है क्योंकि '[[' निर्माण को खोल में बनाया गया है जबकि '' '' test' कमांड के लिए दूसरा नाम है और इसलिए इसके अधीन है इसका वाक्यविन्यास - 'मैन टेस्ट' –

+4

तकनीकी रूप से देखें, '['एक खोल बनाया गया है, लेकिन' [[' एक शैल कीवर्ड है। यह अंतर है। –

+1

तो बैश आदेश 'प्रकार [',' प्रकार [[',' सहायता [' और 'सहायता [['' के परिणाम देखें। – Apostle

2

मेरे पास आपके कोड से नमूना है। इसे आज़माएं:

echo "*Select Option:*" 
echo "1 - script1" 
echo "2 - script2" 
echo "3 - script3 " 
read option 
echo "You have selected" $option"." 
if [ $option="1" ] 
then 
    echo "1" 
elif [ $option="2" ] 
then 
    echo "2" 
    exit 0 
elif [ $option="3" ] 
then 
    echo "3" 
    exit 0 
else 
    echo "Please try again from given options only." 
fi 

यह काम करना चाहिए। :)

+0

गौड नामक एक फ़ाइल है जो मुझे यह दिखती है। 'Else' के बाद क्यों नहीं? यह वास्तव में quirky नहीं हो सकता है, लेकिन सी – Rolf

+0

की तुलना में यह दिखता है, विकल्प $ विकल्प के बाद और पहले = इसे ठीक करने के लिए आवश्यक है, अन्यथा 1 बार – PiyusG

23

जोश ली की जवाब काम करता है, लेकिन आप इस तरह बेहतर पठनीयता के लिए "& &" ऑपरेटर का उपयोग कर सकते हैं:

echo "You have provided the following arguments $arg1 $arg2 $arg3" 
if [ "$arg1" = "$arg2" ] && [ "$arg1" != "$arg3" ] 
then 
    echo "Two of the provided args are equal." 
    exit 3 
elif [ $arg1 = $arg2 ] && [ $arg1 = $arg3 ] 
then 
    echo "All of the specified args are equal" 
    exit 0 
else 
    echo "All of the specified args are different" 
    exit 4 
fi 
1

यह मेरे लिए काम कर रहा है,

# cat checking.sh 
#!/bin/bash 
echo "You have provided the following arguments $arg1 $arg2 $arg3" 
if [ "$arg1" = "$arg2" ] && [ "$arg1" != "$arg3" ] 
then 
    echo "Two of the provided args are equal." 
    exit 3 
elif [ $arg1 == $arg2 ] && [ $arg1 = $arg3 ] 
then 
    echo "All of the specified args are equal" 
    exit 0 
else 
    echo "All of the specified args are different" 
    exit 4 
fi 

# ./checking.sh 
You have provided the following arguments 
All of the specified args are equal 

आप जोड़ सकते हैं त्रुटियों की समस्या निवारण के लिए स्क्रिप्ट में "set -x",

धन्यवाद।

संबंधित मुद्दे