क्लासिक तकनीक (अक्षरों से परे भागने):
if [ \("$g" -eq 1 -a "$c" = "123" \) -o \("$g" -eq 2 -a "$c" = "456" \) ]
then echo abc
else echo efg
fi
मैं दोहरे उद्धरण में $g
के लिए संदर्भ संलग्न है; सामान्य रूप से यह अच्छा अभ्यास है। कड़ाई से, कोष्ठक की आवश्यकता नहीं है क्योंकि -a
और -o
की प्राथमिकता उनके बिना भी सही बनाती है।
ध्यान दें कि -a
और -o
ऑपरेटरों मुख्य रूप से पश्च संगतता के लिए, test
के लिए POSIX विनिर्देशन, उर्फ [
का हिस्सा हैं (क्योंकि वे 7 वें संस्करण UNIX में test
का एक हिस्सा थे, उदाहरण के लिए), लेकिन वे स्पष्ट रूप से के रूप में चिह्नित कर रहे हैं POSIX द्वारा 'obsolescent'। बैश (conditional expressions देखें) -a
और -o
के लिए अपने वैकल्पिक ऑपरेटरों के साथ तर्क लेने के लिए क्लासिक और पॉज़िक्स अर्थों को पसंद करते हैं।
कुछ देखभाल के साथ
, तो आप और अधिक आधुनिक [[
ऑपरेटर का उपयोग, लेकिन ध्यान रखें कि बैश और कॉर्न शैल (उदाहरण के लिए) में संस्करणों समान होने की ज़रूरत नहीं हो सकता है।
for g in 1 2 3
do
for c in 123 456 789
do
if [[ ("$g" -eq 1 && "$c" = "123") || ("$g" -eq 2 && "$c" = "456") ]]
then echo "g = $g; c = $c; true"
else echo "g = $g; c = $c; false"
fi
done
done
उदाहरण रन मैक ओएस एक्स पर बैश 3.2.57 का उपयोग कर:
g = 1; c = 123; true
g = 1; c = 456; false
g = 1; c = 789; false
g = 2; c = 123; false
g = 2; c = 456; true
g = 2; c = 789; false
g = 3; c = 123; false
g = 3; c = 456; false
g = 3; c = 789; false
आप [[
में चर उद्धृत करने के लिए के रूप में आप [
साथ करते हैं, क्योंकि यह एक अलग आदेश नहीं है की जरूरत नहीं है उसी तरह है।
यह एक क्लासिक सवाल नहीं है?
मैंने ऐसा सोचा होगा। हालांकि, वहाँ एक और विकल्प है, अर्थात् है:
if [ "$g" -eq 1 -a "$c" = "123" ] || [ "$g" -eq 2 -a "$c" = "456" ]
then echo abc
else echo efg
fi
वास्तव में, अगर आप autoconf
उपकरण के लिए 'पोर्टेबल खोल के दिशा निर्देशों या संबंधित संकुल, इस अंकन पढ़ा -' ||
'और' &&
'का उपयोग कर - है कि वे क्या सलाह देते हैं।
if [ "$g" -eq 1 ] && [ "$c" = "123" ]
then echo abc
elif [ "$g" -eq 2 ] && [ "$c" = "456" ]
then echo abc
else echo efg
fi
कहाँ कार्यों गूंज के रूप में के रूप में तुच्छ हैं, यह बुरा नहीं है: मैं तुम्हें के रूप में भी अब तक जा सकते हैं लगता है। जब एक्शन ब्लॉक दोहराया जाता है तो कई रेखाएं होती हैं, पुनरावृत्ति बहुत दर्दनाक होती है और पिछले संस्करणों में से एक बेहतर होता है - या आपको कार्यों को अलग-अलग then
ब्लॉक में लागू किए गए फ़ंक्शन में लपेटने की आवश्यकता होती है।
आप खोल की स्थिति के बारे में पूछ नहीं कर रहे हैं लेकिन [परीक्षण] (https://de.wikipedia.org/wiki/Test_%28Unix % 2 9) स्थितियां। आपके उदाहरण में पूरी अभिव्यक्ति का मूल्यांकन 'test' ('[') द्वारा किया जाता है और शेल द्वारा नहीं। खोल केवल '[' के बाहर निकलने की स्थिति का मूल्यांकन करता है। – ceving
यह भी देखें http://stackoverflow.com/questions/16203088/multiple-conditions-if-statement-bash-script – tripleee