Cum am compara două variabile șir într-un 'daca' declarație în Bash?

Am'm încercarea de a obține un "dacă" declarație de a lucra în Bash (folosind Ubuntu):

#!/bin/bash

s1="hi"
s2="hi"

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

Am'am incercat diverse forme de "dacă" declarație, folosind [["$s1" == "$s2"]], cu și fără ghilimele, folosind=, = = " și " - eq, dar eu încă a lua următoarea eroare:

[hi: comanda nu a fost găsit

Am'am cautat pe diverse site-uri și tutoriale și copiat, dar nu't de lucru - cu ce am gresit?

În cele din urmă, vreau să spun că dacă $s1 "conține" $s2, deci cum pot face asta?

Am făcut doar locul de muncă în spații pic.. :/ Cum să-I spun conține?

Am încercat

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

dar nu't de lucru.

Comentarii la întrebare (1)
Soluția

Pentru comparație șir, utilizați:

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

Pentru " a "conține " b", utilizați:

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

(și asigurați-vă că pentru a adăuga spații între simboluri):

rău:

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

bun:

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

Ai nevoie de spații:

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

Trebuie să aveți grijă să lăsați un spațiu între semnul de '[' si ghilimele duble în cazul în care variabila contine aceasta:

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

Anii ^s show spațiile goale trebuie să pleci.

Comentarii (3)

Îți sugerez asta:

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

Observa spațiu alb între deschidere/închidere paranteze și variabile și, de asemenea, spații albe ambalaj '=' semn.

De asemenea, fii atent de script header. L's nu-i același lucru dacă utilizați

#!/bin/bash

sau

#!/bin/sh

Aici's sursa.

Comentarii (4)

Aș sugera:

#!/bin/bash

s1="hi"
s2="hi"

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

Fără ghilimele și cu un singur egal.

Comentarii (3)

Bash4+ exemple. Notă: nu folosiți citate va provoca probleme atunci când cuvintele nu conțin spații etc.. Mereu citat în bash OMI.

Aici sunt câteva exemple BASH4+ :

Exemplul 1, verificați pentru 'da' în șir de caractere (majuscule):

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

Exemplul 2, pentru a verifica 'da' în șir de caractere (majuscule):

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

Exemplu 3, pentru a verifica 'da' din string (case sensitive) :

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

Exemplu 4, verifica 'da' din string (case sensitive):

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

Exemplu 5, potrivire exactă (case sensitive):

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

Exemplu 6, potrivire exactă (majuscule):

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

Exemplu 7, potrivire exactă :

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

Această întrebare a fost deja răspunsuri mari, dar aici se pare că există o mică confuzie între, folosind un singur egal și dublu egal în

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

Principala diferență constă în limbaj de scripting care sunt utilizați. Dacă utilizați bash include apoi #!/bin/bash în incepand de script-ul și de a salva script ca filename.bash. Pentru a executa folosesc bash filename.bash- atunci va trebui să utilizați==`.

Dacă utilizați sh apoi utilizați #!/bin/sh și de a salva script ca filename.sh. Pentru a executa folosesc sh filename.sh- atunci va trebui să utilizați un singur=`. Evita amestecarea lor.

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

Eu nu't au acces la o cutie de linux acum, dar este de fapt un program (și un bash interna), deci eu cred ca trebuie sa pui un spatiu intre [ si primul parametru.

De asemenea, rețineți că șirul operator egalitatea pare a fi o singur =

Comentarii (1)

Acest lucru este mai mult o clarificare mult de raspuns ! Da , indiciul este în mesaj de eroare:

[hi: comanda nu a fost găsit

care arată că "buna" a fost concatenate la "[".

Spre deosebire de în mai multe limbaje de programare tradiționale, în Bash, "[" este o comanda doar ca mult mai evident "e" etc. - l's nu este tratată special doar pentru că-l's un simbol, prin urmare, "[" și (înlocuit) "$s1" care sunt imediat lângă altul în întrebarea dumneavoastră, sunt unite (ca este corect pentru Bash) și apoi încearcă să găsească o comandă în poziția asta: [hi - care este necunoscut pentru Bash.

În C și în alte limbaje, "[" ar fi văzut ca un alt "clasa de caracter" și ar fi disjuncte din următoarele "buna".

Prin urmare, aveți nevoie de un spațiu după deschiderea "[".

Comentarii (0)

Pentru o versiune cu pur Bash și fără "test", dar într-adevăr urât, încercați:

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

Explicație: În ( )un plus de subshell este deschis. Iese cu 0 dacă nu a fost un meci, și încearcă să ieși cu $s1 dacă nu a fost nici un meci care ridică o eroare (urât). Această eroare este îndreptată spre /dev/null.

Comentarii (2)
#!/bin/bash

s1="hi"
s2="hi"

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

Adăugarea suplimentară șir în interiorul face mai sigure.

Ai putea folosi, de asemenea, alte notații pentru o singură linie de comandă:

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