Nếu bạn làm
$ ksh -n 'if [[ 1 -eq 1 ]]; then echo hi; fi'
bạn nhận được tin nhắn
ksh: warning: line 1: -eq within [[...]] obsolete, use ((...))
như bạn đã thấy. Bây giờ hãy thử điều này:
$ ksh -n 'if (( 1 -eq 1 )); then echo hi; fi'
ksh: 1 -eq 1 : arithmetic syntax error
Những công việc này:
$ ksh -n 'if (( 1 == 1 )); then echo hi; fi'
Hãy nhớ rằng tin nhắn đầu tiên chỉ là một cảnh báo. Bạn có thể tiếp tục sử dụng hình thức đó. Tôi nghi ngờ rằng nó sẽ bị xóa vì nó sẽ phá vỡ quá nhiều tập lệnh hiện có. Nhân tiện, điều này được chấp nhận mà không có cảnh báo:
$ ksh -n 'if [ 1 -eq 1 ]; then echo hi; fi'
Một trong những lý do chính mà ngoặc kép được ưa chuộng là các toán tử so sánh là quen thuộc hơn <
, <=
, ==
vv, (ít nhất là khi so sánh với các ngôn ngữ khác).
Dấu ngoặc kép cũng hoạt động trong Bash và zsh. Một hình thức liên quan, trạm biến đổi số học, hoạt động trong tất cả chúng, cộng với nó được chỉ định bởi POSIX.
$ a=$((3 * 4))
Korn, Bash và Z cũng có thể làm theo cách này:
$ (( a = 3 * 4 ))
Mặc dù Dash, như một ví dụ về vỏ POSIX, không hỗ trợ so sánh dấu ngoặc kép trong biểu mẫu if (( ... ))
, bạn vẫn có thể thực hiện chúng bằng cách sử dụng thay thế số học, nhưng kết quả ngược lại với những gì bạn mong đợi (điều này cũng đúng với những người khác).
$ echo $(( 1 == 1 )); (( 1 == 1 )); echo $? # in Dash, use true instead of the second statement
1
0
$ echo $(( 1 == 2 )); (( 1 == 2 )); echo $? # in Dash, use false instead of the second statement
0
1