Secara historis, test
perintah itu ada terlebih dahulu (setidaknya sejauh Unix Seventh Edition pada 1979). Ini digunakan operator =
dan !=
untuk membandingkan string, dan -eq
, -ne
, -lt
, dll untuk membandingkan angka. Misalnya, test 0 = 00
itu salah, tetapi test 0 -eq 00
itu benar. Saya tidak tahu mengapa sintaks ini dipilih, tetapi mungkin untuk menghindari menggunakan <
dan >
, yang shell akan diuraikan sebagai operator pengalihan. The test
perintah mendapat sintaks lain beberapa tahun kemudian: [ … ]
setara dengan test …
.
The [[ … ]]
sintaks kondisional, dalam yang <
dan >
dapat digunakan sebagai operator tanpa mengutip, ditambahkan kemudian, di ksh. Itu tetap kompatibilitas dengan [ … ]
, jadi itu menggunakan operator yang sama, tetapi ditambahkan <
dan >
untuk membandingkan string (misalnya, [[ 9 > 10 ]]
tetapi [[ 9 -lt 10 ]]
). Untuk informasi lebih lanjut, lihat menggunakan braket tunggal atau ganda - bash
Ekspresi aritmatika juga datang lebih lambat dari test
perintah, di kulit Korn , pada suatu waktu di tahun 1980-an. Mereka mengikuti sintaks bahasa C, yang sangat populer di kalangan Unix. Jadi mereka menggunakan operator C: ==
untuk persamaan, <=
untuk kurang-atau-sama, dll.
Unix Seventh Edition tidak memiliki ekspresi aritmatika, tetapi memang memiliki expr
perintah , yang juga menerapkan sintaks mirip C untuk operasi integer, termasuk operator pembandingnya. Dalam skrip shell, karakter <
dan >
harus dikutip untuk melindunginya dari shell, misalnya if expr 1 \< 2; …
setara dengan if test 1 -lt 2; …
. Penambahan ekspresi aritmatika ke shell memanfaatkan sebagian besar expr
usang, sehingga tidak terkenal hari ini.
Dalam skrip sh, Anda biasanya akan menggunakan ekspresi aritmatika untuk menghitung nilai integer, dan [ … ]
membandingkan integer.
if [ "$((x + y))" -lt "$z" ]; then …
Dalam skrip ksh, bash, atau zsh, Anda dapat menggunakan ((…))
keduanya.
if ((x + y < z)); then …
The [[ … ]]
Bentuk berguna jika Anda ingin menggunakan conditional melibatkan hal-hal lain selain bilangan bulat.
= != < <= > >=
bandingkan string .1 -eq 01
but1 != 01
and8 -lt 42
but8 > 42