Lý do cho ksh lỗi thời -eq


8

Phiên bản mới nhất của ksh obsoletes sử dụng -eqtrong [[ ]]các khối, (( ))thay vào đó, thích hơn. Tại sao lại thế này? Tôi không thể tìm thấy bất kỳ tài liệu về những ưu điểm của (( ))hơn [[ ]]bất cứ nơi nào, và tôi thấy cú pháp mà đáng kể rõ ràng hơn.

Ví dụ:

#!/bin/ksh
var=1
if [[ $var -eq 1 ]]
then
  echo ALPHA
fi

cho

[adam@hendrix test]$ ksh -n test.sh
test.sh: warning: line 3: -eq within [[...]] obsolete, use ((...))

Câu trả lời:


8

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
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.