2013-04-24 33 views
104

Tôi đang cố gắng viết một tập lệnh sẽ kiểm tra hai cờ lỗi và trong trường hợp một cờ (hoặc cả hai) bị thay đổi, nó sẽ echo-- lỗi xảy ra. Kịch bản của tôi:Bash nếu câu lệnh có nhiều điều kiện sẽ phát ra lỗi

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 

Về cơ bản, nó phải là, cái gì đó dọc:

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

Các lỗi tôi nhận được là:

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' 

có dấu ngoặc của tôi sai lầm?

+0

Kiểm tra này ra: http: //theunixshell.blogspot.com/2013/ 05/list-of-bash-conditional-statements.html – Vijay

+2

Sử dụng dấu ngoặc đơn -() –

+0

Xem thêm http://stackoverflow.com/questions/3826425/how-to-represent-multiple-conditions-in-a-shell- script – tripleee

Trả lời

167

Sử dụng -a (cho và) và -o (cho hoặc) hoạt động.

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

Cập nhật

Trên thực tế bạn vẫn có thể sử dụng &&|| với những hoạt động -eq. Vì vậy, kịch bản của bạn sẽ như thế này:

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 

Mặc dù trong trường hợp của bạn, bạn có thể loại bỏ hai biểu thức cuối cùng và chỉ gắn bó với một hoặc hoạt động như thế này:

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

cảm ơn bạn đã trả lời nhanh, nhưng trong trường hợp cả hai lá cờ là đúng, nó sẽ không vi phạm điều kiện? –

+2

@Simply_Me: Không, một OR hợp lý là đúng nếu một trong hai * hoặc cả hai * của toán hạng của nó là đúng. Bạn đang nghĩ đến "độc quyền hoặc" (XOR), điều này đúng nếu chính xác một trong các toán hạng của nó là đúng. (Trên thực tế, có các phiên bản XOR hoạt động trên 2 toán hạng, trong trường hợp đó là true nếu một số toán hạng lẻ là đúng.) –

+3

BTW, các vấn đề trong mã ban đầu bao gồm sử dụng '[' và ']' để nhóm (họ không làm điều đó), và không đặt khoảng trống xung quanh toán tử (ví dụ: '" $ my_error_flag "=" 1 "'), điều này ngăn cản trình vỏ nhận ra nó là toán tử. Vui lòng đọc [BashFAQ # 17 (về nhóm)] (http://mywiki.wooledge.org/BashFAQ/017) và [# 31 (về sự khác biệt giữa các loại biểu thức kiểm tra khác nhau)] (http: //mywiki.wooledge .org/BashFAQ/031). Trên thực tế, trong trường hợp này sẽ dễ dàng hơn khi sử dụng [biểu thức số học] (http://mywiki.wooledge.org/ArithmeticExpression). –

38

Bạn có thể sử dụng một trong hai [[ hoặc (( từ khóa. Khi bạn sử dụng từ khóa [[, bạn phải sử dụng toán tử chuỗi như -eq, -lt. Tôi nghĩ rằng, (( được ưu tiên nhất cho số học, bởi vì bạn có thể trực tiếp sử dụng toán tử như ==, <>.

Sử dụng [[ hành

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 

Sử dụng (( hành

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

Không sử dụng -a hoặc -o khai thác Kể từ khi nó không phải là Portable.

1

Bạn có thể lấy cảm hứng bằng cách đọc số entrypoint.shscript được viết bởi những người đóng góp từ MySQL để kiểm tra xem các biến được chỉ định đã được đặt hay chưa.

Như kịch bản cho thấy, bạn có thể đường ống chúng với -a, ví dụ:

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

Vui lòng thử sau

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!"