Alasan ksh obsoleting -eq

8

Versi terbaru dari ksh obsoletes menggunakan -eqdalam [[ ]]blok, prefering (( ))sebagai gantinya. Kenapa ini? Saya tidak dapat menemukan dokumentasi tentang kelebihan (( ))di [[ ]]mana saja, dan saya menemukan sintaks yang jauh lebih jelas.

Sebagai contoh:

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

memberi

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

Jawaban:

8

Jika kamu melakukan

$ ksh -n 'if [[ 1 -eq 1 ]]; then echo hi; fi'

Anda mendapatkan pesannya

ksh: warning: line 1: -eq within [[...]] obsolete, use ((...))

seperti yang kamu lihat. Sekarang coba ini:

$ ksh -n 'if (( 1 -eq 1 )); then echo hi; fi'
ksh:  1 -eq 1 : arithmetic syntax error

Ini bekerja:

$ ksh -n 'if (( 1 == 1 )); then echo hi; fi'

Ingat bahwa pesan pertama hanyalah peringatan. Anda dapat terus menggunakan formulir itu. Saya ragu bahwa itu akan dihapus karena akan merusak terlalu banyak skrip yang ada. Omong-omong, ini diterima tanpa peringatan:

$ ksh -n 'if [ 1 -eq 1 ]; then echo hi; fi'

Salah satu alasan utama yang ganda kurung lebih disukai adalah bahwa operator perbandingan adalah lebih akrab <, <=, ==, dll, (setidaknya bila dibandingkan dengan bahasa lain).

Tanda kurung ganda juga berfungsi di Bash dan zsh. Bentuk terkait, substitusi aritmatika, berfungsi di dalamnya, ditambah ditentukan oleh POSIX.

$ a=$((3 * 4))

Korn, Bash dan Z juga dapat melakukannya dengan cara ini:

$ (( a = 3 * 4 ))

Meskipun Dash, sebagai contoh shell POSIX, tidak mendukung perbandingan tanda kurung ganda dalam formulir if (( ... )), Anda masih dapat melakukannya dengan menggunakan substitusi aritmatika, tetapi hasilnya adalah kebalikan dari apa yang Anda harapkan (ini juga berlaku untuk yang lain).

$ 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
Dijeda sampai pemberitahuan lebih lanjut.
sumber