क्लासिक तकनीक (भागने मेटाचैकर्स):
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
ऑपरेटर मुख्य रूप से बैकवर्ड संगतता के लिए POSIX विनिर्देशन का हिस्सा हैं test
, [
क्योंकि वे test
उदाहरण के लिए (7 वें संस्करण UNIX में एक भाग थे ), लेकिन उन्हें स्पष्ट रूप से POSIX द्वारा 'अश्लील' के रूप में चिह्नित किया गया है। बैश (देखें सशर्त भाव ) के लिए क्लासिक और POSIX अर्थ जगह ले लेना करने लगता है -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
ब्लॉकों में लगाए गए फ़ंक्शन में लपेटने की आवश्यकता है ।
test
([
) द्वारा किया गया है और शेल द्वारा नहीं। शेल केवल बाहर निकलने की स्थिति का मूल्यांकन करता है[
।