Làm cách nào để khai báo và sử dụng các biến Boolean trong tập lệnh shell?


979

Tôi đã cố gắng khai báo biến Boolean trong tập lệnh shell bằng cú pháp sau:

variable=$false

variable=$true

Điều này có đúng không? Ngoài ra, nếu tôi muốn cập nhật biến đó, tôi có sử dụng cùng một cú pháp không? Cuối cùng, cú pháp sau đây để sử dụng các biến Boolean là biểu thức có đúng không?

if [ $variable ]

if [ !$variable ]

73
HÃY THỬ! truefalsetrong bối cảnh của hầu hết các đoạn dưới đây chỉ là các chuỗi đơn giản, không phảibash built-ins!!! Xin vui lòng đọc câu trả lời của Mike Holt dưới đây. (Đây là một ví dụ trong đó câu trả lời được bình chọn và chấp nhận cao là IMHO khó hiểu và làm mờ nội dung sâu sắc trong các câu trả lời ít được bình chọn hơn)
mjv

7
@mjv Hầu hết sự nhầm lẫn về câu hỏi này (và câu trả lời của Miku) là do Miku đã sửa đổi câu trả lời của mình tại một số điểm sau khi một số bình luận được đăng mô tả cách trả lời của Miku liên quan đến việc gọi bash tích hợp true. Hóa ra câu trả lời ban đầu của Miku thực sự đã gọi tích truehợp, nhưng câu trả lời sửa đổi thì không. Điều này khiến các bình luận nói có vẻ sai về cách mã của Miku hoạt động. Câu trả lời của Miku đã được chỉnh sửa để hiển thị rõ ràng cả mã gốc và mã sửa đổi. Hy vọng rằng điều này đặt sự nhầm lẫn để nghỉ ngơi một lần và mãi mãi.
Mike Holt

2
[ true ] && echo yes, true is truevà (upppsss) [ false ] && echo yes, false is also true. / bin / true và / bin / false cung cấp mã trả về $? cho các chức năng không để so sánh.
fcm

Nếu var được đặt variable=somethinghơn là đúng, nếu không đặt variable=thì đó là sai [[ $variable ]] && echo true || echo falsevà ngược lại[[ ! $variable ]] && echo false || echo true
Ivan

Câu trả lời:


1201

Trả lời sửa đổi (ngày 12 tháng 2 năm 2014)

the_world_is_flat=true
# ...do something interesting...
if [ "$the_world_is_flat" = true ] ; then
    echo 'Be careful not to fall off!'
fi

Câu trả lời gốc

Hãy cẩn thận: https://stackoverflow.com/a/21210966/89391

the_world_is_flat=true
# ...do something interesting...
if $the_world_is_flat ; then
    echo 'Be careful not to fall off!'
fi

From: Sử dụng biến boolean trong Bash

Lý do câu trả lời ban đầu được đưa vào đây là vì các ý kiến ​​trước khi sửa đổi vào ngày 12 tháng 2 năm 2014 chỉ liên quan đến câu trả lời ban đầu và nhiều ý kiến ​​sai khi liên kết với câu trả lời sửa đổi. Ví dụ, nhận xét của Dennis Williamson về bash dựng truevào ngày 2 tháng 6 năm 2010 chỉ áp dụng cho câu trả lời ban đầu, không phải là sửa đổi.


37
Để giải thích những gì đang xảy ra: ifcâu lệnh đang thực thi nội dung của biến là hàm dựng sẵn Bash true. Bất kỳ lệnh nào cũng có thể được đặt làm giá trị của biến và giá trị thoát của nó sẽ được ước tính.
Tạm dừng cho đến khi có thông báo mới.

7
@pms Các toán tử "-o" và "-a" chỉ dành cho lệnh "test" (còn gọi là "[]"). Thay vào đó, đây là "if + lệnh", không có "test". (Giống như "if grep foo file; then ...".) Vì vậy, hãy sử dụng các toán tử &&||toán tử bình thường : # t1=true; t2=true; f1=false;# if $t1 || $f1; then echo is_true ; else echo is_false; fi; (trả về "true", vì t1 = true) # if $t1 && $f1 || $t2; then echo is_true ; else echo is_false; fi (trả về "true", vì t2 = true) . Một lần nữa, CHỈ này hoạt động vì "true" / "false" là bash-dựng (trả về true / false). Bạn không thể sử dụng "if $ var ..." trừ khi var là cmd (nghĩa là đúng hay sai)
michael

14
-1, xem câu trả lời của tôi để được giải thích.
Dennis

3
Rất nhiều thông tin không chính xác, ở đây. / bin / true không được sử dụng hiệu quả. Xem câu trả lời của Dennis.
ajk

1
Mã này không giống nhau và không hoạt động giống như bài viết được liên kết. Mã được liên kết gọi một chương trình theo tên được lưu trữ trong một biến nhưng mã trong câu trả lời này chỉ là so sánh chuỗi.
Câu hỏi Quolonel

794

TL; DR

bool=true

if [ "$bool" = true ]

Các vấn đề với câu trả lời ( bản gốc ) của Miku

Tôi không đề nghị câu trả lời được chấp nhận 1 . Cú pháp của nó khá hay, nhưng nó có một số sai sót.

Nói rằng chúng ta có điều kiện sau đây.

if $var; then
  echo 'Muahahaha!'
fi

Trong các trường hợp 2 sau , điều kiện này sẽ đánh giá là đúng và thực thi lệnh lồng nhau.

# Variable var not defined beforehand. Case 1
var=''  # Equivalent to var="".        Case 2
var=    #                              Case 3
unset var  #                           Case 4
var='<some valid command>'  #          Case 5

Thông thường, bạn chỉ muốn điều kiện của mình được đánh giá là đúng khi biến "Boolean" của bạn, vartrong ví dụ này, được đặt rõ ràng thành đúng. Tất cả các trường hợp khác là sai lầm nguy hiểm!

Trường hợp cuối cùng (# 5) đặc biệt nghịch ngợm vì nó sẽ thực thi lệnh chứa trong biến (đó là lý do tại sao điều kiện đánh giá là đúng cho các lệnh 3, 4 hợp lệ ).

Đây là một ví dụ vô hại:

var='echo this text will be displayed when the condition is evaluated'
if $var; then
  echo 'Muahahaha!'
fi

# Outputs:
# this text will be displayed when the condition is evaluated
# Muahahaha!

Trích dẫn các biến của bạn là an toàn hơn, ví dụ if "$var"; then. Trong các trường hợp trên, bạn sẽ nhận được một cảnh báo rằng lệnh không được tìm thấy. Nhưng chúng ta vẫn có thể làm tốt hơn (xem các đề xuất của tôi ở phía dưới).

Cũng xem lời giải thích của Mike Holt về câu trả lời ban đầu của Miku.

Các vấn đề với câu trả lời của Hbar

Cách tiếp cận này cũng có hành vi bất ngờ.

var=false
if [ $var ]; then
  echo "This won't print, var is false!"
fi

# Outputs:
# This won't print, var is false!

Bạn sẽ mong đợi điều kiện trên để đánh giá thành sai, do đó không bao giờ thực hiện câu lệnh lồng nhau. Sự ngạc nhiên!

Trích dẫn giá trị ( "false"), trích dẫn biến ( "$var") hoặc sử dụng testhoặc [[thay vì [, không tạo ra sự khác biệt.

Những gì tôi làm khuyên:

Dưới đây là những cách tôi khuyên bạn nên kiểm tra "Booleans" của mình. Họ làm việc như mong đợi.

bool=true

if [ "$bool" = true ]; then
if [ "$bool" = "true" ]; then

if [[ "$bool" = true ]]; then
if [[ "$bool" = "true" ]]; then
if [[ "$bool" == true ]]; then
if [[ "$bool" == "true" ]]; then

if test "$bool" = true; then
if test "$bool" = "true"; then

Tất cả đều tương đương nhau. Bạn sẽ phải gõ thêm một vài lần nhấn phím so với các cách tiếp cận trong các câu trả lời khác 5 , nhưng mã của bạn sẽ phòng thủ hơn.


Chú thích

  1. Câu trả lời của Miku đã được chỉnh sửa và không còn chứa các lỗ hổng (đã biết).
  2. Không phải là một danh sách đầy đủ.
  3. Một lệnh hợp lệ trong ngữ cảnh này có nghĩa là một lệnh tồn tại. Nó không quan trọng nếu lệnh được sử dụng đúng hoặc không chính xác. Ví dụ, man womanvẫn sẽ được coi là một lệnh hợp lệ, ngay cả khi không có trang man như vậy tồn tại.
  4. Đối với các lệnh không hợp lệ (không tồn tại), Bash sẽ đơn giản phàn nàn rằng lệnh không được tìm thấy.
  5. Nếu bạn quan tâm về chiều dài, khuyến nghị đầu tiên là ngắn nhất.

8
Sử dụng ==với [hoặc testkhông di động. Xem xét tính di động là lợi thế duy nhất [/ testcó hơn [[, gắn bó =.
chepner

2
@Scott Tôi sử dụng làm vỏ chính, có ngôn ngữ kịch bản lành mạnh so với bash theo ý kiến ​​của tôi.
Dennis

1
Vâng, tôi không thể tìm thấy trong các bình luận bất kỳ sự đánh giá cao cho trò đùa ẩn này, vì vậy phải chỉ ra nó =)
Kranach

5
Đối với tôi, về mặt khái niệm sẽ dễ hiểu hơn nếu tôi sử dụng bool = "true". Sau đó, rõ ràng đó chỉ là một chuỗi chứ không phải một giá trị đặc biệt hoặc nội dung.
wvducky

1
@dolmen hoàn toàn, đánh giá đầu vào không phải là rủi ro khi bạn kiểm soát đầu vào, nhưng tôi vẫn coi đó là một thực hành xấu nên tránh nếu có thể dễ dàng tránh được. Một số người chỉ từng nhìn thấy và sử dụng phong cách trước đây có thể không biết về những sai sót của nó có thể gây ra hành vi bất ngờ.
Dennis

175

Dường như có một số hiểu lầm ở đây về việc xây dựng Bash true , và cụ thể hơn, về cách Bash mở rộng và diễn giải các biểu thức bên trong ngoặc.

Mã trong câu trả lời của miku hoàn toàn không liên quan gì đến nội dung Bash true, cũng /bin/truenhư bất kỳ hương vị nào khác của truelệnh. Trong trường hợp này, truekhông có gì khác hơn một chuỗi ký tự đơn giản và không có lệnh gọi truelệnh / dựng sẵn nào được thực hiện, không phải bằng phép gán biến, cũng không phải bằng cách đánh giá biểu thức điều kiện.

Đoạn mã sau giống hệt như mã trong câu trả lời của miku:

the_world_is_flat=yeah
if [ "$the_world_is_flat" = yeah ]; then
    echo 'Be careful not to fall off!'
fi

Sự khác biệt duy nhất ở đây là bốn ký tự được so sánh là 'y', 'e', ​​'a' và 'h' thay vì 't', 'r', 'u' và 'e'. Đó là nó. Không có nỗ lực nào để gọi một lệnh hoặc nội dung được đặt tên yeah, cũng không có (trong ví dụ của miku) bất kỳ loại xử lý đặc biệt nào đang diễn ra khi Bash phân tích mã thông báo true. Nó chỉ là một chuỗi, và một chuỗi hoàn toàn tùy ý ở đó.

Cập nhật (2014/02/19): Sau khi theo liên kết trong câu trả lời của miku, bây giờ tôi thấy một số sự nhầm lẫn đến từ đâu. Câu trả lời của Miku sử dụng dấu ngoặc đơn, nhưng đoạn mã anh liên kết đến không sử dụng dấu ngoặc. Nó chỉ:

the_world_is_flat=true
if $the_world_is_flat; then
  echo 'Be careful not to fall off!'
fi

Cả hai đoạn mã sẽ hành xử theo cùng một cách, nhưng dấu ngoặc thay đổi hoàn toàn những gì đang diễn ra dưới mui xe.

Đây là những gì Bash đang làm trong từng trường hợp:

Không có dấu ngoặc:

  1. Mở rộng biến $the_world_is_flatthành chuỗi "true".
  2. Cố gắng phân tích chuỗi "true"như một lệnh.
  3. Tìm và chạy truelệnh (có thể là lệnh dựng sẵn hoặc /bin/true, tùy thuộc vào phiên bản Bash).
  4. So sánh mã thoát của truelệnh (luôn luôn là 0) với 0. Hãy nhớ lại rằng trong hầu hết các shell, mã thoát 0 biểu thị thành công và bất cứ điều gì khác chỉ ra thất bại.
  5. Vì mã thoát là 0 (thành công), hãy thực hiện mệnh đề ifcủa câu lệnhthen

Chân đế:

  1. Mở rộng biến $the_world_is_flatthành chuỗi "true".
  2. Phân tích biểu thức điều kiện hiện được mở rộng đầy đủ, có dạng string1 = string2. Các =nhà điều hành là bash của so sánh chuỗi điều hành. Vì thế...
  3. Làm một chuỗi so sánh trên "true""true".
  4. Đúng, hai chuỗi là như nhau, vì vậy giá trị của điều kiện là đúng.
  5. Thực hiện mệnh đề ifcủa tuyên bố then.

Mã no-ngoặc hoạt động, bởi vì truelệnh trả về mã thoát là 0, cho biết thành công. Mã ngoặc vuông hoạt động, bởi vì giá trị của $the_world_is_flatnó giống hệt với chuỗi ký tự trueở bên phải của =.

Chỉ cần lái xe về nhà, hãy xem xét hai đoạn mã sau:

Mã này (nếu chạy với quyền root) sẽ khởi động lại máy tính của bạn:

var=reboot
if $var; then
  echo 'Muahahaha! You are going down!'
fi

Mã này chỉ in "Đẹp thử." Lệnh khởi động lại không được gọi.

var=reboot
if [ $var ]; then
  echo 'Nice try.'
fi

Cập nhật (2014-04-14) Để trả lời câu hỏi trong các nhận xét liên quan đến sự khác biệt giữa ===: AFAIK, không có sự khác biệt. Các ==nhà điều hành là một từ đồng nghĩa Bash cụ thể cho =, và như xa như tôi đã nhìn thấy, họ làm việc giống hệt nhau trong mọi hoàn cảnh.

Lưu ý, tuy nhiên, tôi đặc biệt nói về ===toán tử so sánh chuỗi được sử dụng trong cả hai [ ]hoặc [[ ]]kiểm tra. Tôi không gợi ý điều đó ===có thể hoán đổi cho nhau ở mọi nơi trong bash.

Ví dụ, rõ ràng là bạn không thể thực hiện gán biến ==, chẳng hạn như var=="foo"(về mặt kỹ thuật bạn có thể làm điều này, nhưng giá trị varsẽ là "=foo", bởi vì Bash không nhìn thấy một ==toán tử ở đây, nó nhìn thấy một =toán tử (gán), theo sau là các giá trị văn chương ="foo", mà chỉ trở thành"=foo" ).

Ngoài ra, mặc dù ===có thể hoán đổi cho nhau, bạn nên nhớ rằng các bài kiểm tra đó hoạt động như thế nào tùy thuộc vào việc bạn có sử dụng nó bên trong [ ]hay không [[ ]], và cũng có thể trích dẫn các toán hạng hay không. Bạn có thể đọc thêm về điều đó trong Hướng dẫn lập trình Bash nâng cao: 7.3 Toán tử so sánh khác (cuộn xuống phần thảo luận về ===).


Cách tiếp cận không có khung cũng có ưu điểm là cho phép bạn viết sạch, rõ ràng (imo) một lớp như$the_world_is_flat && echo "you are in flatland!"
ajk

9
Thật. Mặc dù, tôi không ủng hộ (hoặc chống lại) một trong hai cách tiếp cận. Tôi chỉ muốn làm sáng tỏ một số thông tin sai lệch đang được bỏ phiếu ở đây, để những người vấp phải chủ đề này sau đó sẽ không bỏ đi với một loạt các quan niệm sai lầm về cách thức hoạt động của tất cả.
Mike Holt

1
Lý do cho sự nhầm lẫn là câu trả lời ban đầu của miku đã tồn tại được 4 năm. Tất cả các tham chiếu đến nội dung trueđược thực hiện liên quan đến câu trả lời ban đầu. (Câu trả lời sửa đổi vào ngày 12 tháng 2 năm 2014 không được gửi bởi miku.) Tôi đã chỉnh sửa câu trả lời để bao gồm cả bản gốc và bản sửa đổi. Sau đó, ý kiến ​​của mọi người có ý nghĩa.
wvducky

1
Từ việc đọc các câu trả lời được cung cấp ở đây, tôi có ấn tượng rằng không có thứ gì thực sự sử dụng thực tế true. Là có một cách? Tôi nghi ngờ nhiều lập trình viên đã quen với các ngôn ngữ khắt khe hơn khi xem câu trả lời này để hỗ trợ họ trộn một số bashchất keo để làm cho cuộc sống của họ dễ dàng hơn một chút sẽ muốn một ===nhà điều hành để các chuỗi và "booleans" không thực sự có thể hoán đổi cho nhau. Họ có nên chỉ sử dụng 0 và 1 và sử dụng (( $maybeIAmTrue ))như được đề xuất trong câu trả lời của Câu hỏi Quolonel không?
Hiếm khi

2
Để giải quyết nhận xét của SeldomNeedy, vâng, bạn có thể sử dụng giá trị thực true, nhưng nói chung không phải là thứ gì đó để so sánh với một biến, vì truegiá trị thực không có giá trị mỗi se. Tất cả những gì nó làm là đặt trạng thái thoát thành 0, biểu thị thành công. Điều đáng chú ý là về cơ bản nó tương đương với cái gọi là "lệnh null", hoặc :. Theo như sử dụng 01, đó là những gì tôi làm trong tất cả các kịch bản của mình những ngày này khi tôi cần booleans. Và tôi sử dụng (( ))toán tử thay vì [[ ]]để đánh giá. Vì vậy, ví dụ, nếu tôi có flag=0, thì tôi có thể làmif (( flag )); then ...
Mike Holt

57

Sử dụng các biểu thức số học.

#!/bin/bash

false=0
true=1

((false)) && echo false
((true)) && echo true
((!false)) && echo not false
((!true)) && echo not true

Đầu ra:

đúng
không sai


3
ưu điểm: (1.) hành vi tương tự như cách xử lý bool của C, cú pháp (2.) rất ngắn gọn / tối thiểu (không yêu cầu biến bên phải và các toán tử như '=' hoặc '=='), (3 .) <chủ quan> đối với tôi Tôi hiểu những gì xảy ra mà không có lời giải thích dài dòng ... trái ngược với câu trả lời của Miku và Dennis mà cả hai đều yêu cầu giải thích dài dòng </ chủ quan>
Trevor Boyd Smith

3
@TrevorBoydSmith Tại sao bạn không nói, "ưu: mọi thứ, khuyết điểm: không có gì". Sẽ tiết kiệm chi phí khấu hao trên bàn phím và màn hình của bạn trong thời gian dài.
Câu hỏi của Quolonel

4
Để sử dụng tương tác, như một lớp lót, hãy đảm bảo để lại một khoảng trống sau !, hoặc nó sẽ thực hiện mở rộng lịch sử. ((! foo))làm việc, cũng vậy ! ((foo)). Tôi thích giải pháp này, BTW. Cuối cùng, một cách ngắn gọn để làm các biến boolean. ((foo || bar))hoạt động như mong đợi.
Peter Cordes

5
(())mở rộng các biến đệ quy, điều mà tôi không mong đợi. foo=bar; bar=baz; ((foo)) && echo echokhông in gì, nhưng nó đúng với baz=1. Vì vậy, bạn có thể hỗ trợ foo=truefoo=falsecũng như 0 hoặc 1 bằng cách làm true=1.
Peter Cordes

2
@quolonel cảm ơn bạn vì tài nguyên rất hữu ích. Tất nhiên sự hiểu biết của tôi là hạn chế - đó là bản chất của con người bị giới hạn trong tất cả sự hiểu biết bất kể tên miền. Tuy nhiên, bạn có phiền khi nói với tôi những phát biểu nào của tôi dẫn bạn đến giả định rằng sự hiểu biết của tôi về vấn đề đặc biệt này là không đầy đủ?
Hubert Grzeskowiak

34

Mẩu chuyện dài:

Không có Booleans trong Bash

Bash không có biểu thức Boolean về mặt so sánh và điều kiện. Điều đó nói rằng, những gì bạn có thể khai báo và so sánh trong Bash là chuỗi và số. Đó là nó.

Bất cứ nơi nào bạn nhìn thấy truehoặc falsetrong Bash, đó là một chuỗi hoặc một lệnh / dựng sẵn chỉ được sử dụng cho mã thoát của nó.

Cú pháp này ...

if true; then ...

thực chất là ...

if COMMAND; then ...

Điều kiện là đúng bất cứ khi nào lệnh trả về mã thoát 0. truefalselà các nội dung Bash và đôi khi cũng là các chương trình độc lập không làm gì ngoài việc trả về mã thoát tương ứng.

Các điều kiện trên tương đương với:

COMMAND && ...

Khi sử dụng dấu ngoặc vuông hoặc testlệnh, bạn dựa vào mã thoát của cấu trúc đó. Hãy ghi nhớ rằng [ ][[ ]]cũng chỉ là các lệnh / nội trang giống như bất kỳ lệnh nào khác. Vì thế ...

if [[ 1 == 1 ]]; then echo yes; fi

tương ứng với

if COMMAND; then echo yes; fi

COMMANDđây là[[ 1 == 1 ]]

Cấu if..then..fitrúc chỉ là cú pháp đường. Bạn luôn có thể chạy các lệnh được phân tách bằng ký hiệu kép và cho cùng một hiệu ứng:

[[ 1 == 1 ]] && echo yes

Khi sử dụng truefalsetrong các cấu trúc thử nghiệm này, bạn thực sự chỉ truyền chuỗi "true"hoặc "false"đến lệnh thử nghiệm. Đây là một ví dụ:

Dù bạn có tin hay không nhưng những điều kiện đó đều cho kết quả như nhau :

if [[ false ]]; then ...
if [[ "false" ]]; then ...
if [[ true ]]; then ...
if [[ "true" ]]; then ...

TL; DR; luôn luôn so sánh với các chuỗi hoặc số

Để làm rõ điều này với độc giả trong tương lai, tôi khuyên bạn nên luôn luôn sử dụng các trích dẫn xung quanh truefalse:

LÀM

if [[ "${var}" == "true" ]]; then ...
if [[ "${var}" == "false" ]]; then ...
if [[ -n "${var:-}" ]]; then echo "var is not empty" ...

KHÔNG

if [ ... ]; then ...  # Always use double square brackets in bash!
if [[ "${var}" ]]; then ...  # This is not as clear or searchable as -n
if [[ "${var}" != true ]]; then ...  # Creates impression of Booleans
if [[ "${var}" -eq "true" ]]; then ...  # `-eq` is for numbers and doesn't read as easy as `==`

Có lẽ

if [[ "${var}" != "true" ]]; then ...  # Creates impression of Booleans. It can be used for strict checking of dangerous operations. This condition is false for anything but the literal string "true".

Tôi thích sử dụng TFlàm rõ rằng những giá trị boolean không thực sự đó.
phk

1
Tôi không thể đồng ý với "luôn luôn sử dụng dấu ngoặc kép trong bash". Trong thực tế, trong hầu hết tất cả các tập lệnh tôi đã viết, tôi đang sử dụng dấu ngoặc đơn, trừ khi tôi cần thực hiện khớp mẫu. Tôi nghĩ người ta nên hiểu sự khác biệt giữa [(nghĩa là test) [[và sử dụng cái phù hợp với nhu cầu của mình.
Weijun Chu

@WeijunZhou tâm trí xây dựng trong trường hợp nào dấu ngoặc đơn là tốt hơn?
Hubert Grzeskowiak

Đó là một sở thích cá nhân, tôi chỉ thấy rằng nó quá táo bạo để nói "Luôn sử dụng dấu ngoặc vuông trong bash". Nhưng có một số trường hợp cạnh mà tôi đã sử dụng. Dấu ngoặc đơn cho phép bạn chỉ định thử nghiệm trong một var. Như một ví dụ đơn giản, hãy xem xétif ....; then mytest='-gt'; else mytest='-eq'; fi; #several lines of code; if [ "$var1" "$mytest" "$var2" ]; then ...; fi
Weijun Zhou

@ WEijunZhou Ví dụ của bạn là một đối số mạnh mẽ đối với dấu ngoặc đơn. Nó làm cho mã khó hiểu hơn nhiều và mở cửa sổ mở rộng cho các lỗi. Dấu ngoặc kép nghiêm ngặt hơn và khuyến khích mã sạch hơn.
Hubert Grzeskowiak

18

Từ lâu, khi tất cả những gì chúng ta có sh, Booleans được xử lý bằng cách dựa vào một quy ước của testchương trình, nơitest trả về trạng thái thoát sai nếu chạy mà không có bất kỳ đối số nào.

Điều này cho phép người ta nghĩ về một biến không được đặt là false và biến được đặt thành bất kỳ giá trị nào là true. Ngày nay, testlà một nội dung của Bash và thường được biết đến bởi bí danh một ký tự của nó [(hoặc một tệp thực thi để sử dụng trong các vỏ thiếu nó, như ghi chú của người cá heo):

FLAG="up or <set>"

if [ "$FLAG" ] ; then
    echo 'Is true'
else
    echo 'Is false'
fi

# Unset FLAG
#    also works
FLAG=

if [ "$FLAG" ] ; then
    echo 'Continues true'
else
    echo 'Turned false'
fi

Do trích dẫn các quy ước, các tác giả kịch bản thích sử dụng lệnh ghép [[bắt chước test, nhưng có cú pháp đẹp hơn: các biến có khoảng trắng không cần phải trích dẫn; người ta có thể sử dụng &&||làm toán tử logic với quyền ưu tiên kỳ lạ và không có giới hạn POSIX về số lượng thuật ngữ.

Ví dụ: để xác định xem FLAG có được đặt hay không và COUNT là số lớn hơn 1:

FLAG="u p"
COUNT=3

if [[ $FLAG  && $COUNT -gt '1' ]] ; then
    echo 'Flag up, count bigger than 1'
else
    echo 'Nope'
fi

Công cụ này có thể gây nhầm lẫn khi tất cả các khoảng trắng, chuỗi có độ dài bằng không và các biến null đều cần thiết và cả khi tập lệnh của bạn cần hoạt động với một số shell.


3
[không chỉ là một bí danh bên trong bash. Bí danh này cũng tồn tại dưới dạng tệp nhị phân (hoặc dưới dạng liên kết trỏ đến) và có thể được sử dụng với mức trần sh. Kiểm tra ls -l /usr/bin/\[. Với bash/ zshbạn nên sử dụng [[đó là một nội bộ thực sự thuần túy và mạnh mẽ hơn nhiều.
heo

1
@dolmen [testcũng là một QUY TẮC Bash SHELL BUILTIN theo trang hướng dẫn Bash, vì vậy không có vấn đề gì trong hiệu suất. Điều tương tự với ví dụ Dash. (/ bin / sh có thể chỉ là một liên kết tượng trưng đến / bin / dash). Để sử dụng thực thi, bạn phải sử dụng đường dẫn đầy đủ tức là /usr/bin/\[.
jarno

12

Làm cách nào để khai báo và sử dụng các biến Boolean trong tập lệnh shell?

Không giống như nhiều ngôn ngữ lập trình khác, Bash không phân tách các biến của nó theo "loại". [1]

Vì vậy, câu trả lời là khá rõ ràng. Không có bất kỳ biến Boolean nào trong Bash.

Tuy nhiên:

Sử dụng một câu lệnh khai báo, chúng ta có thể giới hạn việc gán giá trị cho các biến. [2]

#!/bin/bash
declare -ir BOOL=(0 1) # Remember BOOL can't be unset till this shell terminates
readonly false=${BOOL[0]}
readonly true=${BOOL[1]}

# Same as declare -ir false=0 true=1
((true)) && echo "True"
((false)) && echo "False"
((!true)) && echo "Not True"
((!false)) && echo "Not false"

Các rtùy chọn trong declarereadonlyđược sử dụng để nhà nước một cách rõ ràng rằng các biến là chỉ đọc . Tôi hy vọng mục đích là rõ ràng.


1
Tại sao bạn không làm declare -ir false=0 true=1? Lợi thế của việc sử dụng một mảng là gì?
Benjamin W.

@BenjaminW. Tôi chỉ muốn đề cập đến các rtùy chọn và readonlylệnh. Tôi sẽ làm theo cách bạn đề xuất trong kịch bản của mình
sjsam

có thể tôi đã bỏ lỡ điều gì đó nhưng tại sao không khai báo đúng và sai theo cách này sử dụng ký hiệu đô la? $ true $ false
qodeninja

Nghĩa đen chỉ là sao chép câu trả lời của tôi và làm cho nó tồi tệ hơn.
Câu hỏi của Quolonel

@QuolonelQuestions Các biến Bash không được gõ , do đó không có lý do nào để nói. declare and use boolean variablesChúng ta có thể, theo nhiều cách, bắt chước / giả định rằng một biến có một loại . Tôi không thấy điều đó được đề cập ở bất cứ đâu trong câu trả lời của bạn.
sjsam

10

Thay vì giả mạo một Boolean và để lại một cái bẫy cho những độc giả tương lai, tại sao không sử dụng một giá trị tốt hơn đúng và sai?

Ví dụ:

build_state=success
if something-horrible; then
  build_state=failed
fi

if [[ "$build_state" == success ]]; then
  echo go home; you are done
else
  echo your head is on fire; run around in circles
fi

Tại sao không phải là số nguyên?
phil294

3
@Blauhirn vì số nguyên được sử dụng khác nhau tùy theo ngôn ngữ. Trong một số ngôn ngữ 0cưỡng chế false1đến true. Liên quan đến mã thoát chương trình (sử dụng bash trong lịch sử), nó 0cho kết quả tích cực hoặc truemọi thứ khác là âm / lỗi hoặc false.
Hubert Grzeskowiak

7

POSIX (Giao diện hệ điều hành di động)

Tôi nhớ ở đây điểm quan trọng, đó là tính di động. Đó là lý do tại sao tiêu đề của tôi có POSIX .

Về cơ bản, tất cả các câu trả lời được bình chọn đều đúng, ngoại trừ chúng là Bash -specific quá nhiều.

Về cơ bản, tôi chỉ muốn thêm thông tin về tính di động.


  1. []dấu ngoặc như trong [ "$var" = true ]là không cần thiết, và bạn có thể bỏ qua chúng và sử dụng testlệnh trực tiếp:

    test "$var" = true && yourCodeIfTrue || yourCodeIfFalse

    Lưu ý quan trọng: Tôi không còn khuyến nghị điều này vì nó đang dần bị từ chối và khó kết hợp nhiều câu lệnh hơn.

  2. Hãy tưởng tượng những từ đó truefalsecó nghĩa gì với cái vỏ, hãy tự kiểm tra nó:

    echo $(( true ))
    0
    echo $(( false ))
    1

    Nhưng sử dụng dấu ngoặc kép:

    echo $(( "true" ))
    bash: "true": syntax error: operand expected (error token is ""true"")
    sh (dash): sh: 1: arithmetic expression: expecting primary: ""true""

    Tương tự đối với:

    echo $(( "false" ))

    Shell không thể giải thích nó ngoài một chuỗi. Tôi hy vọng bạn sẽ có được ý tưởng tốt như thế nào khi sử dụng từ khóa thích hợp mà không có dấu ngoặc kép .

    Nhưng không ai nói điều đó trong câu trả lời trước.

  3. Điều đó có nghĩa là gì? Vâng, một số điều.

    • Bạn nên làm quen với các từ khóa Boolean thực sự được xử lý như số, đó là true= 0false= 1, hãy nhớ tất cả các giá trị khác không được xử lý như thế nào false.

    • Vì chúng được coi là số, bạn cũng nên đối xử với chúng như vậy, tức là nếu bạn xác định biến nói:

      var_bool=true
      echo "$var_bool"
       true

      bạn có thể tạo một giá trị ngược lại với:

      var_bool=$(( 1 - $var_bool ))  # same as $(( ! $var_bool ))
      echo "$var_bool"
      1

    Như bạn có thể thấy, shell in truechuỗi lần đầu tiên bạn sử dụng nó, nhưng kể từ đó, tất cả hoạt động thông qua số 0đại diện truehoặc 1đại diện false, tương ứng.


Cuối cùng, bạn nên làm gì với tất cả thông tin đó

  • Đầu tiên, một thói quen tốt sẽ được chỉ định 0thay vì true; 1thay vì false.

  • Thói quen tốt thứ hai sẽ là kiểm tra xem biến đó có / không bằng không:

    if [ "$var_bool" -eq 0 ]; then
         yourCodeIfTrue
    else
         yourCodeIfFalse
    fi

6

Về cú pháp, đây là một phương pháp đơn giản mà tôi sử dụng (ví dụ) để quản lý logic Boolean một cách nhất quán và ổn định:

# Tests
var=
var=''
var=""
var=0
var=1
var="abc"
var=abc

if [[ -n "${var}" ]] ; then
    echo 'true'
fi
if [[ -z "${var}" ]] ; then
    echo 'false'
fi

# Results
# var=        # false
# var=''      # false
# var=""      # false
# var=0       # true
# var=1       # true
# var="abc"   # true
# var=abc     # true

Nếu biến không bao giờ được khai báo, câu trả lời là: # false

Vì vậy, một cách đơn giản để đặt một biến thành true (sử dụng phương pháp cú pháp này) sẽ là var=1; ngược lại , var=''.

Tài liệu tham khảo:

-n = Đúng nếu độ dài của chuỗi var khác không.

-z = Đúng nếu độ dài của chuỗi var bằng không.


5

Trong nhiều ngôn ngữ lập trình, kiểu Boolean, hoặc được triển khai dưới dạng một kiểu con của số nguyên, trong đó truehành xử giống 1falsehành xử như 0:

Về mặt toán học , đại số Boolean giống với modulo số học số nguyên 2. Do đó, nếu một ngôn ngữ không cung cấp loại Boolean gốc, giải pháp tự nhiên và hiệu quả nhất là sử dụng các số nguyên. Điều này hoạt động với hầu hết mọi ngôn ngữ. Ví dụ, trong Bash bạn có thể làm:

# val=1; ((val)) && echo "true" || echo "false"
true
# val=0; ((val)) && echo "true" || echo "false"
false

người đàn ông bash :

((biểu hiện))

Biểu thức được đánh giá theo các quy tắc được mô tả dưới đây trong ĐÁNH GIÁ ARITHMETIC. Nếu giá trị của biểu thức là khác không, trạng thái trả về là 0; mặt khác, trạng thái trả về là 1. Điều này hoàn toàn tương đương với "biểu thức".


5

Bill Parker đang được bỏ phiếu xuống , bởi vì định nghĩa của ông bị đảo ngược so với quy ước mã thông thường. Thông thường, true được định nghĩa là 0 và false được định nghĩa là khác không. 1 sẽ hoạt động sai, cũng như 9999 và -1. Tương tự với các giá trị trả về hàm - 0 là thành công và bất cứ điều gì khác không là thất bại. Xin lỗi, tôi chưa có uy tín trên đường phố để bỏ phiếu hoặc trả lời trực tiếp cho anh ấy.

Bash khuyên bạn nên sử dụng dấu ngoặc kép bây giờ như một thói quen thay vì dấu ngoặc đơn và liên kết mà Mike Holt đưa ra giải thích sự khác biệt trong cách chúng hoạt động. 7.3. Toán tử so sánh khác

Đối với một điều, -eqlà một toán tử số, do đó, có mã

#**** NOTE *** This gives error message *****
The_world_is_flat=0;
if [ "${The_world_is_flat}" -eq true ]; then

sẽ đưa ra một tuyên bố lỗi, mong đợi một biểu thức số nguyên. Điều này áp dụng cho một trong hai tham số, vì không phải là một giá trị nguyên. Tuy nhiên, nếu chúng ta đặt dấu ngoặc kép xung quanh nó, nó sẽ không đưa ra một tuyên bố lỗi, nhưng nó sẽ mang lại một giá trị sai (tốt, trong 50% các hoán vị có thể có). Nó sẽ đánh giá thành [[0 -eq true]] = thành công, nhưng cũng là [[0 -eq false]] = thành công, đó là sai (hmmm .... điều gì về việc xây dựng đó là một giá trị số?).

#**** NOTE *** This gives wrong output *****
The_world_is_flat=true;
if [[ "${The_world_is_flat}" -eq true ]]; then

Có những hoán vị khác của điều kiện cũng sẽ cho đầu ra sai. Về cơ bản, bất cứ điều gì (ngoài điều kiện lỗi được liệt kê ở trên) đặt một biến thành một giá trị số và so sánh nó với một nội dung đúng / sai hoặc đặt một biến thành một nội dung đúng / sai và so sánh nó với một giá trị số. Ngoài ra, bất cứ điều gì đặt biến thành một nội dung đúng / sai và thực hiện so sánh bằng cách sử dụng -eq. Vì vậy, tránh -eqđể so sánh Boolean và tránh sử dụng các giá trị số cho so sánh Boolean. Dưới đây là tóm tắt về các hoán vị sẽ cho kết quả không hợp lệ:

# With variable set as an integer and evaluating to true/false
# *** This will issue error warning and not run: *****
The_world_is_flat=0;
if [ "${The_world_is_flat}" -eq true ]; then

# With variable set as an integer and evaluating to true/false
# *** These statements will not evaluate properly: *****
The_world_is_flat=0;
if [ "${The_world_is_flat}" -eq true ]; then
#
if [[ "${The_world_is_flat}" -eq true ]]; then
#
if [ "${The_world_is_flat}" = true ]; then
#
if [[ "${The_world_is_flat}" = true ]]; then
#
if [ "${The_world_is_flat}" == true ]; then
#
if [[ "${The_world_is_flat}" == true ]]; then


# With variable set as an true/false builtin and evaluating to true/false
# *** These statements will not evaluate properly: *****
The_world_is_flat=true;
if [[ "${The_world_is_flat}" -eq true ]]; then
#
if [ "${The_world_is_flat}" = 0 ]; then
#
if [[ "${The_world_is_flat}" = 0 ]]; then
#
if [ "${The_world_is_flat}" == 0 ]; then
#
if [[ "${The_world_is_flat}" == 0 ]]; then

Vì vậy, bây giờ để những gì làm việc. Sử dụng các nội dung đúng / sai cho cả so sánh và đánh giá của bạn (như Mike Hunt đã lưu ý, không bao gồm chúng trong dấu ngoặc kép). Sau đó, sử dụng một hoặc một hoặc hai dấu bằng (= hoặc ==) và dấu ngoặc đơn hoặc dấu ngoặc kép ([] hoặc [[]]). Cá nhân, tôi thích dấu bằng kép, vì nó nhắc tôi về sự so sánh logic trong các ngôn ngữ lập trình khác và dấu ngoặc kép chỉ vì tôi thích gõ. Vì vậy, những công việc này:

# With variable set as an integer and evaluating to true/false
# *** These statements will work properly: *****
#
The_world_is_flat=true/false;
if [ "${The_world_is_flat}" = true ]; then
#
if [[ "${The_world_is_flat}" = true ]]; then
#
if [ "${The_world_is_flat}" = true ]; then
#
if [[ "${The_world_is_flat}" == true ]]; then

Có bạn có nó.


2
Các true/ falsedựng sẵn không được sử dụng ở đây (bỏ qua những gì cú pháp tô sáng của một số trình soạn thảo có thể ngụ ý), đặc biệt trong các […]trường hợp bạn có thể nghĩ về nó như một chuỗi đơn giản ở đây (một chuỗi được đưa ra như một tham số cho [lệnh).
phk

Bạn có nó ngay bây giờ.
Peter Mortensen

4

Phát hiện và đề xuất của tôi khác một chút so với các bài viết khác. Tôi thấy rằng về cơ bản, tôi có thể sử dụng "booleans" như bất kỳ ngôn ngữ "thông thường" nào, mà không cần "nhảy vòng" đề nghị ...

Không cần bất kỳ []sự so sánh chuỗi rõ ràng nào ... Tôi đã thử nhiều bản phân phối Linux. Tôi đã thử Bash, Dash và BusyBox . Kết quả luôn giống nhau. Tôi không chắc chắn những gì bài viết được bình chọn hàng đầu ban đầu đang nói về. Có lẽ thời gian đã thay đổi và đó là tất cả?

Nếu bạn đặt một biến thành true, sau đó nó sẽ đánh giá là "khẳng định" trong một điều kiện. Đặt nó thành falsevà nó đánh giá là "âm". Rất đơn giản! Nhắc nhở duy nhất, là một biến không xác định cũng đánh giá như đúng ! Sẽ thật tuyệt nếu nó làm ngược lại (như trong hầu hết các ngôn ngữ), nhưng đó là mẹo - bạn chỉ cần khởi tạo một cách rõ ràng các booleans của mình thành đúng hoặc sai .

Tại sao nó hoạt động theo cách này? Câu trả lời đó là hai lần. A) true / false trong shell thực sự có nghĩa là "không có lỗi" so với "lỗi" (tức là 0 so với bất cứ điều gì khác). B) true / false không phải là giá trị - mà là các câu lệnh trong shell script! Về điểm thứ hai, việc thực thi truehoặc falsetrên một dòng tự đặt giá trị trả về cho khối bạn đang ở trong giá trị đó, nghĩa falselà một tuyên bố về "lỗi gặp phải", trong đó "xóa" đúng. Sử dụng nó với một gán cho một biến "trả lại" vào biến đó. Một biến không xác định sẽ đánh giá như truetrong một điều kiện bởi vì nó tương đương với 0 hoặc "không gặp phải lỗi".

Xem các dòng Bash ví dụ và kết quả dưới đây. Tự kiểm tra nếu bạn muốn xác nhận ...

#!/bin/sh

# Not yet defined...
echo "when set to ${myBool}"
if ${myBool}; then echo "it evaluates to true"; else echo "it evaluates to false"; fi;

myBool=true
echo "when set to ${myBool}"
if ${myBool}; then echo "it evaluates to true"; else echo "it evaluates to false"; fi;

myBool=false
echo "when set to ${myBool}"
if ${myBool}; then echo "it evaluates to true"; else echo "it evaluates to false"; fi;

Sản lượng

when set to
it evaluates to true
when set to true
it evaluates to true
when set to false
it evaluates to false

1

Đây là một ví dụ đơn giản phù hợp với tôi:

temp1=true
temp2=false

if [ "$temp1" = true ] || [ "$temp2" = true ]
then
    echo "Do something." 
else
    echo "Do something else."
fi

1

Đây là một thực hiện của một bàn tay ngắn if true.

# Function to test if a variable is set to "true"
_if () {
    [ "${1}" == "true" ] && return 0
    [ "${1}" == "True" ] && return 0
    [ "${1}" == "Yes" ] && return 0
    return 1
}

ví dụ 1

my_boolean=true

_if ${my_boolean} && {
    echo "True Is True"
} || {
    echo "False Is False"
}

Ví dụ 2

my_boolean=false
! _if ${my_boolean} && echo "Not True is True"

Có, phân rã chức năng được đánh giá thấp.
Peter Mortensen

1

Tôi tìm thấy những câu trả lời khó hiểu.

Cá nhân, tôi chỉ muốn có một cái gì đó trông và hoạt động như C.

Đoạn mã này hoạt động nhiều lần trong ngày trong sản xuất:

snapshotEvents=true

if ($snapshotEvents)
then
    # Do stuff if true
fi

và để giữ cho mọi người hạnh phúc, tôi đã thử nghiệm:

snapshotEvents=false

if !($snapshotEvents)
then
    # Do stuff if false
fi

Mà cũng làm việc tốt.

Các $snapshotEventsđánh giá nội dung của giá trị của biến. Vì vậy, bạn cần $.

Bạn không thực sự cần dấu ngoặc đơn, tôi chỉ thấy chúng hữu ích.


2
Khi bạn xóa dấu ngoặc đơn, đây chính xác là câu trả lời ban đầu của @ miku ở trên cùng.
heo

1
Không có dấu ngoặc đơn biểu thức không đánh giá.
sẽ

@ sẽ có nó. Bạn không cần () s.
phil294

1
@Blauhirn ... Xin chào, tôi dựa trên nhận xét của mình về các thử nghiệm với GNU Bash trên Linux Mint / Ubuntu PC. Bạn có thể đúng trong lý thuyết () - không cần thiết. Phản ứng duy nhất của tôi, là dùng thử, nó dường như phụ thuộc vào phiên bản Bash, biểu thức hoặc bối cảnh thực tế và như vậy.
sẽ

1

Đây là một cải tiến về câu trả lời ban đầu của miku nhằm giải quyết những lo ngại của Dennis Williamson về trường hợp biến không được đặt:

the_world_is_flat=true

if ${the_world_is_flat:-false} ; then
    echo "Be careful not to fall off!"
fi

Và để kiểm tra nếu biến là false:

if ! ${the_world_is_flat:-false} ; then
    echo "Be careful not to fall off!"
fi

Về các trường hợp khác có nội dung khó chịu trong biến, đây là vấn đề với bất kỳ đầu vào bên ngoài nào được cung cấp cho chương trình.

Bất kỳ đầu vào bên ngoài phải được xác nhận trước khi tin tưởng nó. Nhưng việc xác nhận đó phải được thực hiện chỉ một lần, khi đầu vào đó được nhận.

Nó không phải tác động đến hiệu suất của chương trình bằng cách thực hiện nó trên mỗi lần sử dụng biến như Dennis Williamson gợi ý.


1

Bạn có thể sử dụng shFlags .

Nó cung cấp cho bạn tùy chọn để xác định: DEFINE_bool

Thí dụ:

DEFINE_bool(big_menu, true, "Include 'advanced' options in the menu listing");

Từ dòng lệnh bạn có thể xác định:

sh script.sh --bigmenu
sh script.sh --nobigmenu # False

GFlags không có ý nghĩa gì trong câu trả lời này - đó là một thư viện C ++. Nó không thể được sử dụng trực tiếp trong các kịch bản shell.
Jonathan Cross

Phản hồi được cập nhật cho shFlags, một cổng của GFlags sang shell.
khí đốt

0

Đây là bài kiểm tra tốc độ về các cách khác nhau để kiểm tra giá trị "Boolean" trong Bash:

#!/bin/bash
rounds=100000

b=true # For true; b=false for false
type -a true
time for i in $(seq $rounds); do command $b; done
time for i in $(seq $rounds); do $b; done
time for i in $(seq $rounds); do [ "$b" == true ]; done
time for i in $(seq $rounds); do test "$b" == true; done
time for i in $(seq $rounds); do [[ $b == true ]]; done

b=x; # Or any non-null string for true; b='' for false
time for i in $(seq $rounds); do [ "$b" ]; done
time for i in $(seq $rounds); do [[ $b ]]; done

b=1 # Or any non-zero integer for true; b=0 for false
time for i in $(seq $rounds); do ((b)); done

Nó sẽ in một cái gì đó như

true is a shell builtin
true is /bin/true

real    0m0,815s
user    0m0,767s
sys     0m0,029s

real    0m0,562s
user    0m0,509s
sys     0m0,022s

real    0m0,829s
user    0m0,782s
sys     0m0,008s

real    0m0,782s
user    0m0,730s
sys     0m0,015s

real    0m0,402s
user    0m0,391s
sys     0m0,006s

real    0m0,668s
user    0m0,633s
sys     0m0,008s

real    0m0,344s
user    0m0,311s
sys     0m0,016s

real    0m0,367s
user    0m0,347s
sys     0m0,017s

-2

Thay thế - sử dụng chức năng

is_ok(){ :;}
is_ok(){ return 1;}
is_ok && echo "It's OK" || echo "Something's wrong"

Xác định hàm ít trực quan hơn, nhưng kiểm tra giá trị trả về của nó là rất dễ dàng.


1
Đây không phải là một biến mà bạn có thể kiểm tra, mà là một hàm không đổi
jarno

@jarno Việc kiểm tra giá trị trả về của hàm có khác với kiểm tra biến, cho mục đích của tập lệnh không?
johnraff

Vâng, câu hỏi là về các biến.
jarno

Đúng, mặc dù cách sử dụng trong tập lệnh shell sẽ giống nhau.
johnraff

-2

Bash thực sự bối rối cho vấn đề này với những cái tên như [, [[, ((, $((vv

Tất cả giẫm lên không gian mã của nhau. Tôi đoán điều này chủ yếu là lịch sử, nơi Bash phải giả vờ shthỉnh thoảng.

Hầu hết thời gian, tôi chỉ có thể chọn một phương pháp và gắn bó với nó. Trong trường hợp này, tôi có xu hướng khai báo (tốt nhất là trong một tệp thư viện chung mà tôi có thể đưa .vào trong (các) tập lệnh thực tế của mình).

TRUE=1; FALSE=0

Sau đó tôi có thể sử dụng ((... ))toán tử số học để kiểm tra.

testvar=$FALSE

if [[ -d ${does_directory_exist} ]]
then
    testvar=$TRUE;
fi

if (( testvar == TRUE )); then
    # Do stuff because the directory does exist
fi
  1. Bạn phải có kỷ luật. Bạn testvarphải được đặt thành $TRUEhoặc $FALSEmọi lúc.

  2. Trong ((... bộ ))so sánh, bạn không cần phần trước $, điều này làm cho nó dễ đọc hơn.

  3. Tôi có thể sử dụng ((... ))bởi vì $TRUE=1$FALSE=0, tức là các giá trị số.

  4. Nhược điểm là phải sử dụng $đôi khi:

    testvar=$TRUE

    mà không đẹp lắm

Nó không phải là một giải pháp hoàn hảo, nhưng nó bao gồm mọi trường hợp tôi cần cho một bài kiểm tra như vậy.


2
Bạn nên khai báo hằng số của bạn chỉ đọc. Ngoài ra, vui lòng luôn sử dụng dấu ngoặc nhọn khi sử dụng biến. Đó là một quy ước tất cả mọi người nên gắn bó với IMHO. Nhược điểm lớn của giải pháp này là bạn không thể trộn biểu thức đại số với cờ kiểm tra hoặc so sánh chuỗi.
Hubert Grzeskowiak
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.