2012-06-14 32 views
11

Có ai biết cách thực hiện nhiều câu lệnh trong một bài kiểm tra bash không? Vì vậy, nếu tôi sử dụng:Cách để thực hiện nhiều câu lệnh cho mỗi bài kiểm tra bash && statement

[[ $Var = 1 ]] && echo "yes-1" || echo "no-1" 

Và thiết Var=1 sau đó đầu ra là: yes-1
Nếu tôi đặt Var=2 sau đó đầu ra là: no-1

Và công việc này như tôi mong đợi. Nhưng nếu tôi cố gắng thêm một câu lệnh khác để thực thi trong bản mix và nó không hoạt động:

[[ $Var = 1 ]] && echo "yes-1";echo "yes-2" || echo "no-1";echo "no-2" 

Điều này có nghĩa là bash thấy lệnh kết thúc tại; nhưng ... đây không phải là điều tôi muốn.

Tôi đã thử nhóm và tìm kiếm các chức năng và đã thất bại và thành công nhưng tôi thực sự chỉ muốn làm là có công việc này trên một dòng. Ai có ý tưởng gì không?

Trả lời

19

Nhóm lệnh đơn giản sẽ hoạt động; cú pháp có thể hơi phức tạp một chút.

[[ $Var = 1 ]] && { echo "yes-1"; echo "yes-2"; } || { echo "no-1"; echo "no-2"; } 

Một số điều cần lưu ý: lời khuyên

  1. chú ý @ TVM về việc sử dụng một tuyên bố if-then-else nếu bạn làm bất cứ điều gì phức tạp hơn.

  2. Mọi lệnh bên trong niềng răng cần được chấm dứt bằng dấu chấm phẩy, thậm chí dấu cuối cùng.

  3. Mỗi dấu ngoặc nhọn phải được tách biệt với văn bản xung quanh bằng khoảng trắng ở cả hai bên. Niềng răng không gây ra dấu ngắt từ trong bash, vì vậy "{echo" là một từ duy nhất, "{echo" là một cú đúp theo sau là từ "echo".

+0

Cảm ơn tôi đã thử một cái gì đó như thế này nhưng phải bỏ lỡ ";" ở cuối câu lệnh thứ hai. –

+0

Tôi đã cung cấp cho bạn câu trả lời đúng vì ";" ở cuối mỗi câu lệnh, nó làm việc với hoặc() subshell hoặc {} grouping. –

+0

IMO, nhóm lệnh tốt hơn, trong hầu hết các trường hợp. ví dụ. nếu bạn muốn thoát khỏi một kịch bản khi một cái gì đó không thành công bạn có thể làm 'foocmd || {echo foo không thành công; thoát 1; } 'và nó sẽ in chẩn đoán và thoát. Nếu bạn sử dụng subshells để nhóm, chỉ có subshell chính nó sẽ thoát, không phải là scipt, mà gần như chắc chắn không phải là hiệu ứng dự định. – JVMATL

2

Sử dụng subshells:

$ Var=1; [[ $Var = 1 ]] && (echo "yes-1";echo "yes-2") || (echo "no-1";echo "no-2";) 
yes-1 
yes-2 

$ Var=2; [[ $Var = 1 ]] && (echo "yes-1";echo "yes-2") || (echo "no-1";echo "no-2";) 
no-1 
no-2 
+1

Có tác dụng này và tôi thề là tôi đã thử một cái gì đó giống như vậy.Tôi đã lưu ý rằng bạn không cần ";" rằng bạn có sau khi "no-2" echo để có nó làm việc nhưng có nó không làm tổn thương và làm cho nó rõ ràng nếu bạn thay đổi "()" để "{}" sau đó bạn cần ";". –

+0

Tôi đã tăng số lượng của bạn để tôi đi xuống con đường. Như đã nói với "chepner" với ";" ở cuối mỗi câu lệnh hoặc() chia nhỏ hoặc {} nhóm sẽ hoạt động! –

+0

@ pn1dude đồng ý, tôi luôn luôn sử dụng ';' ở cuối tất cả các lệnh của tôi trong một subshell hoặc nhóm chỉ để nhất quán ('" trường hợp đặc biệt không đủ đặc biệt để phá vỡ các quy tắc "': P). Lý do duy nhất tôi không có thời gian này là bởi vì tôi đã vội vàng và tôi sao chép/dán mã của bạn và chỉ đơn giản là tôi quên: P Tôi vui vì tôi đã giúp, chúc may mắn – KurzedMetal

10

Xem xét sử dụng thường xuyên NẾU tuyên bố THEN ELSE. Sử dụng & & và || được chứng minh trong bài kiểm tra đơn giản như thế này:

[[ -z "$PATH" ]] && echo 'Disaster, PATH is empty!' || echo 'Everything ok!' 

Nhưng, hãy xem xét lệnh sau:

true && true && true && false && true || echo 'False!' 
False! 

HOẶC

true && { echo true; false ; } || { echo false; true ; } 
true 
false 

Bất cứ lúc nào một-zero phi trạng thái thoát được trả lại, lệnh sau | | được thực hiện. Như bạn thấy, ngay cả nhóm lệnh cũng không giúp được gì.

Thực hiện trong subshell cư xử theo cách tương tự:

true && (true; echo true; true; false) || (true; echo true; false) 
true 
true 

Chỉ cần sử dụng thường xuyên IF, nếu bạn cần đúng NẾU hành vi.

+0

Bạn có thể đúng nhưng nhóm có vẻ không hoạt động. Tôi thường sử dụng cấu trúc if-else-fi, nhưng giống như vị ngọt ngắn của [[]] && || và trên báo cáo nhanh chóng và dễ dàng đôi khi tôi có 2 tham gia và if-else-fi chiếm rất nhiều mã cho một [[]] && || nhanh chóng và dơ bẩn với nhiều câu lệnh. –

Các vấn đề liên quan