Bagaimana cara membandingkan dua string variabel dalam 'jika' pernyataan di Bash?

I'm berusaha untuk mendapatkan sebuah jika pernyataan untuk bekerja di Bash (menggunakan Ubuntu):

#!/bin/bash

s1="hi"
s2="hi"

if ["$s1" == "$s2"]
then
  echo match
fi

I've mencoba berbagai bentuk jika pernyataan, menggunakan [["$s1" == "$s2"]], dengan dan tanpa tanda kutip, menggunakan =, == dan eq, tapi saya masih mendapatkan error berikut:

[hi: perintah tidak ditemukan

I've melihat di berbagai situs dan tutorial dan disalin mereka, tapi itu doesn't bekerja - apa yang saya lakukan salah?

Akhirnya, saya ingin mengatakan jika $s1 berisi $s2, jadi bagaimana saya bisa melakukan itu?

Saya tidak hanya bekerja di luar ruang sedikit.. :/ Bagaimana cara mengucapkan berisi?

Aku mencoba

if [[ "$s1" == "*$s2*" ]]

tapi itu tidak't bekerja.

Mengomentari pertanyaan (1)
Larutan

Untuk perbandingan string, gunakan:

if [ "$s1" == "$s2" ]

Untuk a berisi b, gunakan:

if [[ $s1 == *"$s2"* ]]

(dan pastikan untuk menambahkan spasi di antara simbol-simbol):

buruk:

if ["$s1" == "$s2"]

baik:

if [ "$s1" == "$s2" ]
Komentar (7)

Anda membutuhkan ruang:

if [ "$s1" == "$s2" ]
Komentar (4)

Anda harus berhati-hati untuk meninggalkan ruang antara tanda '[' dan tanda kutip ganda di mana variabel ini berisi:

if [ "$s1" == "$s2" ]; then
#   ^     ^  ^     ^
   echo match
fi

The ^s menunjukkan ruang kosong yang anda butuhkan untuk pergi.

Komentar (3)

Saya sarankan yang satu ini:

if [ "$a" = "$b" ]

Melihat ruang putih antara pembukaan/penutupan kurung dan variabel-variabel dan juga ruang putih pembungkus '=' tanda.

Juga, berhati-hati dari anda script header. It's tidak sama hal apakah yang anda gunakan

#!/bin/bash

atau

#!/bin/sh

Di sini's sumber.

Komentar (4)

Saya akan menyarankan:

#!/bin/bash

s1="hi"
s2="hi"

if [ $s1 = $s2 ]
then
  echo match
fi

Tanpa tanda kutip ganda dan dengan hanya satu sama dengan.

Komentar (3)

Bash4+ contoh. Catatan: tidak menggunakan tanda kutip akan menyebabkan masalah ketika kata-kata yang mengandung spasi dll.. Selalu kutipan di bash IMO.

Berikut ini adalah beberapa contoh BASH4+ :

Contoh 1, memeriksa 'ya' di string (tidak case sensitive):

if [[ "${str,,}" == *"yes"* ]] ;then

Contoh 2, periksa 'ya' di string (tidak case sensitive):

if [[ "$(echo "$str" | tr '[:upper:]' '[:lower:]')" == *"yes"* ]] ;then

Contoh 3, periksa 'ya' di string (tidak case sensitive) :

 if [[ "${str}" == *"yes"* ]] ;then

Contoh 4, periksa 'ya' di string (tidak case sensitive):

 if [[ "${str}" =~ "yes" ]] ;then

Contoh 5, sama persis (case sensitive):

 if [[ "${str}" == "yes" ]] ;then

Contoh 6, persis (case sensitive):

 if [[ "${str,,}" == "yes" ]] ;then

Contoh 7, pencocokan tepat :

 if [ "$a" = "$b" ] ;then
Komentar (1)

Pertanyaan ini sudah jawaban yang besar tapi di sini tampak bahwa ada sedikit kebingungan antara menggunakan sama tunggal dan ganda sama dengan di

if [ "$s1" == "$s2" ]

Perbedaan utama terletak pada yang scripting bahasa yang anda gunakan. Jika anda menggunakan bash kemudian termasuk #!/bin/bash di awal script dan simpan script anda sebagai nama berkas.bash. Untuk mengeksekusi menggunakan nama file bash.bash - maka anda harus menggunakan ==.

Jika anda menggunakan sh kemudian menggunakan #!/bin/sh dan simpan script anda sebagai filename.sh. Untuk mengeksekusi menggunakan sh filename.sh - maka anda harus menggunakan single =. Hindari mencampurkan mereka.

Komentar (6)
$ if [ "$s1" == "$s2" ]; then echo match; fi
match
$ test "s1" = "s2" ;echo match
match
$
Komentar (1)

Saya don't memiliki akses ke kotak linux sekarang, tapi [ sebenarnya adalah suatu program (dan bash builtin), jadi saya pikir anda harus menempatkan ruang antara [ dan parameter pertama.

Juga perhatikan bahwa string kesetaraan operator tampaknya menjadi satu =

Komentar (1)

Ini adalah klarifikasi lebih lanjut dari jawaban ! Ya , petunjuk adalah dalam pesan galat:

[hi: perintah tidak ditemukan

yang menunjukkan anda bahwa anda "hi" telah digabungkan ke "[".

Tidak seperti dalam banyak bahasa pemrograman tradisional, di Bash, "[" adalah perintah seperti lebih jelas "ls" dll. - it's tidak diperlakukan khusus hanya karena itu's simbol, maka "[" dan (diganti) "$s1" yang langsung di sebelah satu sama lain dalam pertanyaan anda, bergabung (sebagai benar untuk Bash) dan kemudian mencoba untuk menemukan perintah dalam posisi itu: [hi - yang tidak diketahui untuk Bash.

Dalam C dan beberapa bahasa lain, "[" akan dilihat sebagai berbeda "kelas karakter" dan akan utma dari berikut "hi".

Oleh karena itu anda memerlukan ruang setelah pembukaan "[".

Komentar (0)

Untuk versi dengan murni Bash dan tanpa test, tapi benar-benar jelek, cobalah:

if ( exit "${s1/*$s2*/0}" )2>/dev/null
then
   echo match
fi

Penjelasan: Dalam ( )tambahan subkulit dibuka. Itu keluar dengan 0 jika ada pertandingan, dan mencoba untuk keluar dengan $s1 jika tidak ada pertandingan yang menimbulkan kesalahan (jelek). Kesalahan ini diarahkan untuk /dev/null.

Komentar (2)
#!/bin/bash

s1="hi"
s2="hi"

if [ "x$s1" == "x$s2" ]
then
  echo match
fi

Menambahkan string tambahan dalam membuatnya lebih aman.

Anda juga bisa menggunakan notasi lain untuk satu baris perintah:

[ "x$s1" == "x$s2" ] && echo match
Komentar (2)