Baca itu untuk membandingkan string di dalam if
kita perlu menggunakan tanda kurung ganda. Beberapa buku mengatakan bahwa perbandingan dapat dilakukan oleh =
. Tapi itu bekerja dengan baik ==
juga.
#!/bin/bash
a="hello"
b="world"
if [[ $a == $b ]];then
echo "equal"
fi
Apakah ada perbedaan antara =
dan ==
dalam perbandingan?
bash
shell-script
user3539
sumber
sumber
=
adalah untuk[
.==
adalah untuk[[
.==
, yang mengapa Anda harus menggunakan=
(kesetaraan) dengan[
, dan==
(pencocokan pola, dengan semantik yang mengutip-sadar) dengan[[
. Lihathelp test
vshelp [[
.[ foo == foo ] && echo foo
tentu saja dicetakfoo
, yang menunjukkan bahwa==
bekerja dengan[
. Namun, jika dengan "adalah untuk" maksud Anda "dimaksudkan untuk digunakan dengan", maka saya memiliki keberatan yang lebih kecil.[[
yang memiliki pemahaman yang jauh lebih bernuansa tentang tokenisasi, pemisahan kata, dll ...Jawaban:
[[ $a == $b ]]
bukan perbandingan, itu pencocokan pola. Anda membutuhkan[[ $a == "$b" ]]
perbandingan kesetaraan byte-ke-byte.=
sama dengan==
shell yang mendukung[[...]]
(diperkenalkan olehksh
).[[...]]
bukansh
sintaks standar . The[
perintah standar, dan standar perbandingan Operator ada=
(meskipun beberapa[
implementasi juga mengakui==
).Sama seperti dalam argumen apa pun untuk perintah apa pun, variabel harus dikutip, jadi:
Secara standar
sh
, pencocokan pola dilakukan dengancase
:Untuk kelengkapannya, operator serupa kesetaraan lainnya yang mungkin Anda jumpai dalam skrip shell:
[ "$a" -eq "$b" ]
: standar[
operator untuk membandingkan angka integer desimal. Beberapa[
implementasi memungkinkan kosong di sekitar angka, beberapa memungkinkan ekspresi aritmatika sewenang-wenang, tetapi itu tidak portabel. Mudah dibawa, seseorang dapat menggunakannya[ "$((a))" -eq "$((b))" ]
untuk itu. Lihat juga[ "$((a == b))" -ne 0 ]
yang akan menjadi setara standar (kecuali POSIXly, perilaku hanya ditentukan jika$a
dan$b
mengandung konstanta integer) dari:((a == b))
, dari ksh dan juga ditemukan dizsh
danbash
, mengembalikan true jika evaluasi ekspresi aritmatika yang disimpan dalam$a
menghasilkan angka yang sama dengan$b
. Biasanya, itu digunakan untuk membandingkan angka. Perhatikan bahwa ada variasi di antara shell tentang bagaimana ekspresi aritmatika dievaluasi dan angka apa yang didukung (misalnya bash dan beberapa implementasi / versi ksh tidak mendukung floating point atau memperlakukan angka dengan angka nol di depan sebagai oktal).expr "$a" = "$b"
melakukan perbandingan angka jika kedua operan dikenali sebagai angka integer desimal (beberapa mengizinkan kekosongan di sekitar angka), dan sebaliknya memeriksa apakah dua operator string memiliki urutan pengurutan yang sama. Itu juga akan gagal untuk nilai$a
atau$b
yangexpr
seperti operator(
,substr
...awk 'BEGIN{exit !(ARGV[1] == ARGV[2])}' "$a" "$b"
: jika$a
dan$b
dikenali sebagai angka (setidaknya bilangan bulat desimal dan angka floating point seperti 1.2, -1.5e-4, blank trailing blank diabaikan, beberapa juga mengenali heksadesimal, oktal atau apa pun yang dikenali olehstrtod()
), maka perbandingan numerik dilakukan. Jika tidak, tergantung pada implementasinya, itu adalah perbandingan string byte-ke-byte, atau seperti untukexpr
sebuahstrcoll()
perbandingan, yaitu apakah$a
dan$b
semacam sama.Lihat juga:
sumber
Ini setara dengan bash:
Dua variabel $ x pertama tidak perlu dikutip. Bash melakukan pemisahan kata dan perluasan pathname di dalam [tetapi tidak di dalam [[:
[[ $x = "$y" ]]
adalah perbandingan string tetapi[[ $x = $y ]]
ekspresi pencocokan pola:-eq hanya dimaksudkan untuk digunakan dengan bilangan bulat:
Lihat juga BashFAQ / 031: Apa perbedaan antara tes, [dan [[? .
sumber