Karena penasaran, ketika melakukan perbandingan variabel bash (nilainya menjadi an integer
) dimungkinkan untuk mengujinya terhadap beberapa nilai yang telah ditentukan baik dinyatakan sebagai int
atau sebagai a string
.
Contoh skrip :
#!/bin/bash
f1()
{
[ "$1" == "1" ] && echo "$FUNCNAME: \"1\" compared as string"
}
f2()
{
[[ "$1" -eq 1 ]] && echo "$FUNCNAME: \"1\" compared as int"
}
f1 $1
f2 $1
Keluaran :
$ ./param.sh 1
f1: "1" compared as string
f2: "1" compared as int
dan
$ ./param.sh blah
$
Kedua fungsi berperilaku dengan cara yang sama, jadi saya ingin tahu apakah ada cara yang lebih disukai ketika memeriksa variabel integer? Saya akan pergi untuk memeriksa int
versus int
karena lebih ketat tapi saya ingin tahu apakah ada penarikan kembali melakukannya dengan string
?
Dalam hal ini, f2()
juga lebih ketat tentang perbandingan, yaitu melewati nilai desimal akan mematahkannya, sedangkan f1()
akan membawanya tidak ada masalah.
Jawaban:
Yap, banyak sekali perbedaannya. Misalnya,
=
memeriksa persamaan string yang tepat, tetapi-eq
mengevaluasi kedua ekspresi secara hitung sebelum memeriksa kesetaraan:Selain itu, string kosong secara numerik sama dengan nol:
Dan seluruh kelas perbedaan lainnya muncul ketika Anda membawa operator pembanding - mempertimbangkan
<
vs-lt
, misalnya:Ini karena string "2" secara alfabetis setelah string "10" (karena 1 muncul sebelum 2), tetapi angka "2" secara numerik kurang dari angka "10".
sumber
(( ... ))
untuk operasi numerik.(( " 1 " == 1 )) && echo yes || echo no
hasil dalamyes
Perbandingan bilangan bulat vs bilangan bulat menjadi paling signifikan ketika Anda membandingkan lebih besar atau lebih kecil dari:
Yang pertama gagal karena 9 muncul setelah 11 ketika diurutkan secara leksikografis.
Perhatikan bahwa menggunakan tanda kutip tidak menentukan apakah Anda membandingkan string atau angka, yang dilakukan operator. Anda dapat menambah atau menghapus tanda kutip di atas, tidak ada bedanya. Bash menangkap variabel yang tidak ditentukan dalam kurung ganda, jadi tanda kutip tidak diperlukan. Menggunakan kutipan dengan tanda kurung tunggal untuk pengujian numerik tidak akan menyelamatkan Anda sejak:
tetap merupakan kesalahan ("diperlukan ekspresi integer"). Kutipan adalah perlindungan yang efektif dengan perbandingan string dalam kurung tunggal:
Catatan dalam kurung ganda ,
""
akan-eq 0
tetapi tidak== 0
.sumber
[[
cukup pintar untuk mengingat di mana variabel berada, dan itu tidak akan tertipu oleh variabel kosong. Kurung tunggal ([
) tidak memiliki fitur ini, dan memerlukan penawaran.[[ -lt 11 ]]
adalah kesalahan, tetapinothing=; [[ $nothing -lt 11 ]]
tidak. Saya telah mengerjakan ulang paragraf terakhir sedikit.Selain apa yang telah dikatakan.
Membandingkan kesetaraan lebih cepat dengan angka, meskipun dalam skrip shell jarang Anda memerlukan perhitungan cepat.
sumber
=
, karena menggunakan-eq
juga cocok dengan "+123". Jika Anda ingin tahu "Apakah variabel ini, ketika dievaluasi sebagai ekspresi aritmatika, bandingkan dengan 123", Anda hanya bisa menggunakan-eq
. Satu-satunya waktu saya bisa melihat di mana seorang programmer tidak akan peduli definisi kesetaraan mana yang digunakan adalah ketika dia tahu bahwa isi variabel dibatasi pada pola tertentu sebelumnya.b=234
) cocok dengan pola itu - Anda tahu itu bukan +234 atau "234" atau "233 +1", karena Anda menetapkannya sendiri, jadi Anda tahu bahwa itu membandingkannya sebagai string dan sebagai angka sama-sama valid. Tetapi skrip OP, karena dibutuhkan input sebagai argumen baris perintah, tidak memiliki kendala itu - pertimbangkan menyebutnya sebagai./param.sh 0+1
atau./param.sh " 1"