यदि कई शर्तों के साथ स्टेटमेंट में कोई त्रुटि है तो बैश करें


165

मैं एक स्क्रिप्ट लिखने की कोशिश कर रहा हूं जो दो त्रुटि झंडे की जांच करेगा, और अगर एक झंडा (या दोनों) बदल दिया जाता है तो यह गूंज होगा - त्रुटि हुई। मेरी स्क्रिप्ट:

my_error_flag=0
my_error_flag_o=0
do something.....
if [[ "$my_error_flag"=="1" || "$my_error_flag_o"=="2" ] || [ "$my_error_flag"="1" &&     "$my_error_flag_o"="2" ]]; then
    echo "$my_error_flag"
else
    echo "no flag"
fi

मूल रूप से, यह होना चाहिए, कुछ साथ:

if ((a=1 or b=2) or (a=1 and b=2))
  then
     display error
else
     no error
fi

मुझे जो त्रुटि मिलती है वह है:

 line 26: conditional binary operator expected
 line 26: syntax error near `]'
 line 26: `if [[ "$my_error_flag"=="1" || "$my_error_flag_o"=="2" ] || [ "$my_error_flag"="1" && "$my_error_flag_o"="2" ]]; then'

क्या मेरे कोष्ठक गड़बड़ हैं?



2
कोष्ठक का प्रयोग करें - ()
एलिकएल्ज़िन-किलका

यह भी देखें stackoverflow.com/questions/3826425/...
tripleee

3
तार्किक रूप से, a==1 or b==2पहले से ही मामले को कवर करता है a==1 and b==2। इसके लिए अलग से परीक्षण करना यहां पूरी तरह से अतिश्योक्तिपूर्ण है।
12

जवाबों:


249

उपयोग -a(के लिए और) और -o((या के लिए) संचालन।

tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_01.html

अपडेट करें

वास्तव में आप अभी भी उपयोग कर सकते हैं &&और ऑपरेशन के ||साथ -eq। तो आपकी स्क्रिप्ट इस तरह होगी:

my_error_flag=1
my_error_flag_o=1
if [ $my_error_flag -eq 1 ] ||  [ $my_error_flag_o -eq 2 ] || ([ $my_error_flag -eq 1 ] && [ $my_error_flag_o -eq 2 ]); then
      echo "$my_error_flag"
else
    echo "no flag"
fi

यद्यपि आपके मामले में आप पिछले दो भावों को त्याग सकते हैं और इस तरह से एक या ऑपरेशन के साथ रह सकते हैं:

my_error_flag=1
my_error_flag_o=1
if [ $my_error_flag -eq 1 ] ||  [ $my_error_flag_o -eq 2 ]; then
      echo "$my_error_flag"
else
    echo "no flag"
fi

3
@Simply_Me: नहीं, एक तार्किक या सच है अगर दोनों या उसके दोनों ऑपरेंड सच हैं। आप "एक्सक्लूसिव या" (XOR) के बारे में सोच रहे हैं, जो कि सही है अगर उसका कोई ऑपरेंड सच है। (वास्तव में, XOR के संस्करण हैं जो 2 से अधिक ऑपरेंड पर काम करते हैं, इस मामले में यह सच है कि यदि विषम संख्या में ऑपरेंड सही हैं।)
गॉर्डन डेविसन

4
BTW, मूल कोड में समस्याओं का उपयोग करना [और ]समूहन के लिए (वे ऐसा नहीं करते हैं) शामिल हैं, और ऑपरेटर (जैसे "$my_error_flag"="1") के चारों ओर रिक्त स्थान रखने में विफल हैं , जो शेल को ऑपरेटर के रूप में पहचानने से रोकता है। कृपया BashFAQ # 17 (समूहीकरण पर) और # 31 (विभिन्न प्रकार की परीक्षण अभिव्यक्ति के बीच अंतर पर ) पढ़ें । दरअसल, इस मामले में एक अंकगणितीय अभिव्यक्ति का उपयोग करना और भी आसान होगा ।
गॉर्डन डेविसन २४'१३

7
-aऔर POSIX विनिर्देश-o द्वारा अप्रचलित माना जाता है ; अद्यतन में अलग-अलग परीक्षणों का उपयोग करें। ||
चेपनर

1
उप-समूह का उपयोग करके समूह की आवश्यकता नहीं है, सामान्य रूप से समूह का उपयोग {}करना भी संभव होना चाहिए।
phk

1
ऊपर दिए गए phk के कमेंट में जोड़ने के लिए, () bash में सबशेल लॉन्च कर रहा है, जिसमें सभी प्रकार के सूक्ष्म [संभवतः अवांछित] प्रभाव हो सकते हैं।
ब्रेट

70

आप [[या तो ((कीवर्ड का उपयोग कर सकते हैं । जब आप [[कीवर्ड का उपयोग करते हैं , तो आपको स्ट्रिंग ऑपरेटर जैसे -eq, का उपयोग करना होगा -lt। मुझे लगता है, ((अंकगणित के लिए सबसे अधिक पसंद किया जाता है, क्योंकि आप सीधे ऑपरेटरों का उपयोग कर सकते हैं जैसे कि ==, <और >

[[ऑपरेटर का उपयोग करना

a=$1
b=$2
if [[ a -eq 1 || b -eq 2 ]] || [[ a -eq 3 && b -eq 4 ]]
then
     echo "Error"
else
     echo "No Error"
fi

((ऑपरेटर का उपयोग करना

a=$1
b=$2
if (( a == 1 || b == 2 )) || (( a == 3 && b == 4 ))
then
     echo "Error"
else
     echo "No Error"
fi

पोर्टेबल होने के बाद से इसका उपयोग न करें -aया -oऑपरेट न करें ।


8

कृपया निम्न प्रयास करें

if ([ $dateR -ge 234 ] && [ $dateR -lt 238 ]) || ([ $dateR -ge 834 ] && [ $dateR -lt 838 ]) || ([ $dateR -ge 1434 ] && [ $dateR -lt 1438 ]) || ([ $dateR -ge 2034 ] && [ $dateR -lt 2038 ]) ;
then
    echo "WORKING"
else
    echo "Out of range!"

2
( ... )बिना किसी लाभ के सबस्क्रिप्शन - बहुत सारे प्रदर्शन प्रभाव पैदा करता है।
चार्ल्स डफी

4
{ ...; }उप-निर्माण के बिना समूहीकरण के लिए उपयोग करें ।
चार्ल्स डफी

1

आप MySQL से योगदानकर्ताओं द्वारा लिखी गई एक entrypoint.sh स्क्रिप्ट को पढ़कर कुछ प्रेरणा प्राप्त कर सकते हैं जो यह जांचता है कि क्या निर्दिष्ट चर सेट किए गए थे।

जैसा कि स्क्रिप्ट से पता चलता है, आप उन्हें पाइप कर सकते हैं -a उदाहरण के लिए :

if [ -z "$MYSQL_ROOT_PASSWORD" -a -z "$MYSQL_ALLOW_EMPTY_PASSWORD" -a -z "$MYSQL_RANDOM_ROOT_PASSWORD" ]; then
    ...
fi

1
-aPOSIX testमानक के वर्तमान संस्करण में अप्रचलित के रूप में चिह्नित है ; pubs.opengroup.org/onlinepubs/9699919799/utilities/test.htmlOB पर मार्कर देखें । अधिक विश्वसनीय कोड का उपयोग करें । [ -z "$FOO" ] && [ -z "$BAR" ]
चार्ल्स डफी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.