शेल में एक जटिल स्थिति का सिंटैक्स क्या है?


11

यदि शेल (श) में निम्नलिखित परीक्षण व्यक्त करना चाहते हैं:

if ( a == 1 && ( b == 1 || b == 2 )) { ... }

अब तक, सबसे अच्छा मैं यह लिखने में सक्षम है:

if [[ $a -eq 1 ]]; then
  if [[ $b -eq 1 || $b -eq 2 ]]; then
     ...
  fi
fi

मैं नहीं जानता कि कैसे यौगिक && और || सही पूर्वता के साथ। Googling ने मुझे कोई जवाब नहीं दिया है (ट्यूटोरियल केवल मूल उदाहरण देते हैं, यदि कोई हो)

यदि उन दोनों को एक में मिलाया जाए तो वाक्य रचना क्या है ?


1
उपयोग न करने का कोई कारण ksh? तब आपके प्रारंभिक कोड को केवल एक और जोड़ी कोष्ठक की आवश्यकता होगी:if (( a == 1 && ( b == 1 || b == 2 ))); then :; fi
मैनटवर्क

जवाबों:


15

ध्यान दें कि [[ ]]Bourne या POSIX में से कोई भी नहीं है sh। सही shसिंटैक्स के लिए, ऐसा करने के कई तरीके हैं।

केवल एक [ ]जोड़ी का उपयोग करना

if [ 1 -eq "$a" -a \( 1 -eq "$b" -o 2 -eq "$b" \) ]; then
    # ...
fi

या POSIX -aऔर -oविकल्प 1 से बचना

if [ 1 -eq "$a" ] && { [ 1 -eq "$b" ] || [ 2 -eq "$b" ]; }; then
    # ...
fi

1 एक से बचने के लिए कारण -aऔर -oअधिकतम पोर्टेबिलिटी है - बिल्कुल नहीं testया [कार्यान्वयन की तुलना में अधिक 4 तर्क है, जो ठीक है अगर आप के साथ भाव श्रृंखला आप क्या मिलता है संभाल कर सकते हैं -aऔर -oऔर \( \)


मेरी लिपियों में # है! / बिन / श शबंग, और डिफ़ॉल्ट शेल ksh है । श का उपयोग क्यों नहीं किया जाएगा?
ऑफिशो

2
@ ओफ़र्मो यदि आप अपनी स्क्रिप्ट की घोषणा करते हैं /bin/sh, तो यह नहीं कि सुविधाओं का उपयोग करके स्क्रिप्ट लिखना गलत है sh। तुम्हें पता होना चाहिए कि kshनहीं है sh, बल्कि एक सुपरसेट है sh। यदि आप अपनी ksh-बुटी-घोषित-के रूप में shस्क्रिप्ट को एक ऐसी प्रणाली में ले जाते हैं, जहां shकोई सिमलिंक नहीं है ksh, तो यह टूट सकता है। आप यह सुनिश्चित कर सकते हैं कि आपकी स्क्रिप्ट घोषणा से मेल खाती है।
jw013

मैंने सोचा था कि शबंग के रूप में सेटिंग / बिन / श मेरी स्क्रिप्ट को बिन / श के माध्यम से लागू किया जाएगा । क्या आपका मतलब यह है कि मेरा डिफ़ॉल्ट शेल (ksh) शेलबैंग को अनदेखा करता है और सीधे इसकी व्याख्या करता है?
ऑफिरमो

@ ओफ़्फ़र्मो आप सही हैं: एक किन्नर /bin/shका आह्वान होगा /bin/sh। समस्या /bin/shस्वीकार नहीं करता है [[। आप या तो [[एक शेल का उपयोग या उपयोग नहीं कर सकते हैं जो स्वीकार करता है [[, उदाहरण के लिए ksh, आपके शेबंग के रूप में।
jw013

2
समस्या नहीं है कि है कि -a/ -oकुछ कार्यान्वयन द्वारा समर्थित नहीं हैं, लेकिन यह मनमाने ढंग से तर्क के लिए विश्वसनीय नहीं है कि। जैसे कई कार्यान्वयन के साथ जैसे [ "$a" = "$b" -o "$b" = "$c" ]मूल्यों के लिए असफल होगा । $a![
स्टीफन चेजलस

2

मैंने कुछ वाक्य रचना की कोशिश की और पाया

if [[ $a -eq 1 ]] && [[ $b -eq 1 || $b -eq 2 ]]; then
 ...
fi

काम कर रहा है।


1
यह 4 संस्करण से ऊपर के संस्करण के लिए काम करता है
निखिल मुल्ले


0

इसे मात्र करने का सही तरीका shell:

if test 1 -eq "$a" && test 1 -eq "$b" -o 2 -eq "$b"; then 
    ...
fi

स्पष्टीकरण:

testयहाँ कोष्ठक के रूप में और -oतार्किक या के रूप में कार्य करता है । यदि आप एक तार्किक और "कोष्ठक" के अंदर उपयोग करते हैं -a

उस पर और अधिक यहाँ पाया जा सकता है

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