2013-04-24 5 views
104

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

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' 

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

+0

चेक इस बाहर: http: //theunixshell.blogspot.com/2013/ 05/सूची के- बैश-सशर्त-statements.html – Vijay

+2

कोष्ठक का उपयोग (-) –

+0

भी देखें http://stackoverflow.com/questions/3826425/how-to-represent-multiple-conditions-in-a-shell- स्क्रिप्ट – tripleee

उत्तर

167

उपयोग -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 
+0

त्वरित उत्तर के लिए धन्यवाद, लेकिन यदि दोनों झंडे सत्य हैं, तो क्या यह इस स्थिति का उल्लंघन नहीं करेगा? –

+2

@Simply_Me: नहीं, एक तार्किक या सत्य है यदि या तो * या उसके * ऑपरेटरों के दोनों सत्य हैं। आप "अनन्य या" (एक्सओआर) के बारे में सोच रहे हैं, जो सच है यदि उसके ऑपरेटरों में से एक सच है। (असल में, एक्सओआर के संस्करण हैं जो 2 से अधिक ऑपरेटरों पर काम करते हैं, इस मामले में यह सच है यदि ऑपरेटरों की एक अजीब संख्या सही है।) –

+3

बीटीडब्ल्यू, मूल कोड में समस्याओं में समूह के लिए '[' और ']' का उपयोग करना शामिल है (वे ऐसा नहीं करते हैं), और ऑपरेटर के चारों ओर रिक्त स्थान डालने में विफल रहे हैं (उदाहरण के लिए '"my_error_flag" = "1" '), जो खोल को ऑपरेटर के रूप में पहचानने से रोकता है। कृपया पढ़ें [BashFAQ # 17 (समूह पर)] (http://mywiki.wooledge.org/BashFAQ/017) और [# 31 (विभिन्न प्रकार की परीक्षण अभिव्यक्ति के बीच अंतर पर)] (http: //mywiki.wooledge .org/BashFAQ/031)। असल में, इस मामले में [अंकगणितीय अभिव्यक्ति] (http://mywiki.wooledge.org/ArithmeticExpression) का उपयोग करना और भी आसान होगा। –

38

आप उपयोग कर सकते हैं या तो [[ या (( कीवर्ड। जब आप [[ कीवर्ड का उपयोग करते हैं, तो आपको -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 ऑपरेटरों का प्रयोग न करें क्योंकि यह पोर्टेबल नहीं है।

1

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

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

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

निम्नलिखित का प्रयास करें

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!" 
संबंधित मुद्दे