Bash ilə "if" talimatında iki simli dəyişənləri necə müqayisə etmək olar?

Bash ( Bash Ubuntu istifadə edərək) if işləməyə çalışıram:

 #!/bin/bash s1="hi" s2="hi" if ["$s1" == "$s2"] then echo match fi 

= , ==-eq istifadə edərək, -eq[["$s1" == "$s2"]] istifadə edərək, if müxtəlif formalarını -eq , amma hələ də aşağıdakı səhvləri alıram:

[salam: əmr tapılmadı

Mən müxtəlif saytlara və təlimatlara baxdım və onları kopyaladım, amma işə yaramır - mən nəyi səhv edirəm?

Nəhayət, $s1 $s2 ehtiva edirsə, demək istəyirəm ki, bunu necə edə bilərəm?

Mən yalnız yerini işlətdim: / İçindəki sözləri necə deyə bilərəm?

Mən çalışdım

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

ancaq işə yaramadı.

457
25 нояб. 25 noyabrda cənab Şoubs tərəfindən təyin olundu 2010-11-25 16:39 '10 at 16:39 PM 2010-11-25 16:39
@ 12 cavab

Dizeleri müqayisə etmək üçün aşağıdakıları istifadə edin:

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

b ehtiva edir, istifadə edin:

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

(və simvollar arasında boşluqlar əlavə etməyi unutmayın):

pis:

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

yaxşı:

 if [ "$s1" == "$s2" ] 
626
25 нояб. Cavab verilir marcog 25 nov. 2010-11-25 16:49 '10 at 16:49 2010-11-25 16:49

Boşluqlara ehtiyacınız var:

border=0
 if [ "$s1" == "$s2" ] 
143
25 нояб. cavab 25 noyabrda açılacaq 2010-11-25 16:40 '10 at 16:40 2010-11-25 16:40

"[" Və "ikiqat tirnoq işarələri" arasında dəyişikliyin olduğu bir yer ayırmaq üçün diqqətli olmalısınız:

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

^ ayrılmaq üçün lazım olan yerləri göstərir.

117
29 янв. cavab cavjo08 29 yanvar verilir 2013-01-29 18:16 '13 at 18:16 2013-01-29 18:16

Aşağıdakıları təklif edirəm:

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

Sürüşmə və bağlanma mötərizələr və dəyişənlər arasında boş yer, eləcə də "=" işarəsi olan ağ boşluqlara diqqət yetirin.

Ayrıca, skript başlığı ilə diqqətli olun. Istifadə etsəniz, eyni deyil

 #!/bin/bash 

və ya

 #!/bin/sh 

İşdə mənbə .

28
27 нояб. Abderrazak BOUADMA tərəfindən verilmiş cavab 27 noyabr. 2014-11-27 17:29 '14 at 17:29 2014-11-27 17:29

Təklif edirəm:

 #!/bin/bash s1="hi" s2="hi" if [ $s1 = $s2 ] then echo match fi 

İki cüt tirajı və yalnız birinə bərabərdir.

11
25 нояб. cavab cümə axşamı verilir . 2010-11-25 16:42 '10 at 16:42 2010-11-25 16:42

Bu sual onsuz da böyük cavablar var, amma burada bərabər bərabərlik və ikili ilə bərabər istifadə arasında bir az qarışıqlıq var

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

Əsas fərq, bir scripting dili istifadə etdiyiniz. Bash istifadə edirsinizsə, skriptin yuxarısında #!/bin/bash daxil edin və skripti filename.bash kimi saxlaya bilərsiniz. bash filename.bash istifadə etmək üçün, == istifadə etməlisiniz.

Sh istifadə etsəniz #!/bin/sh və scriptini filename.sh olaraq saxlaya bilərsiniz. sh filename.sh istifadə etmək üçün - tək = istifadə etməlisiniz. Onları qarışdırmaqdan çəkinin.

9
29 марта '16 в 11:42 2016-03-29 11:42 Cavab Rahul Dahiya tərəfindən 29 Mart '16 'da 11:42 2016-03-29 11:42' də verilir
 $ if [ "$s1" == "$s2" ]; then echo match; fi match $ test "s1" = "s2" ;echo match match $ 
7
25 нояб. Cavab qwerty verilir 25 noyabr. 2010-11-25 16:52 '10 at 16:52 2010-11-25 16:52

Mən indi linux qutusuna daxil deyiləm, amma [bu, həqiqətən, bir proqramdır (bash builtin), buna görə [və ilk parametr arasında] bir boşluq qoymalısınız.

Həmçinin simli bərabərlik operatorunun tək = olaraq göründüyünü qeyd edin

6
25 нояб. Cavab, Mrki 25 noyabr tarixində verilir. 2010-11-25 16:43 '10 at 16:43 2010-11-25 16:43

Bu cavabdan daha çox aydınlıqdır! Bəli, əsas səhv mesajdadır:

[salam: əmr tapılmadı

"salam" ın "[".

Ənənəvi proqramlaşdırma dilləri fərqli olaraq, Bashdə "[" bir əmr, eləcə də daha aydın "ls" və s. - bu bir simvol olduğundan xüsusi olaraq işlənməmişdir, buna görə də, sorğunuzda bir-birinizin yanında olan "$ s1" ("Bash" üçün doğru olduğu kimi) bağlıdır və sonra çalışır bu mövqedə bir əmr tapın: [hi - unknown Bash.

C və digər dillərdə "[" başqa bir "xarakter sinfi" kimi qəbul ediləcək və aşağıdakı "salam" ilə uyğun gəlmir.

Buna görə, "[".

5
13 авг. Cavab MikeW 13 aug tərəfindən verilir . 2015-08-13 13:26 '15, saat 13:26 'da, 2015-08-13 13:26

Bash4 +. Qeyd: sözlər istifadə etməyin boşluqlar və s. Həmişə IMO-da bash göstərin.

Bəşq 4-nin bəzi nümunələri:

Örnek 1, xəttdə "bəli" yoxlayın (halda laqeyd):

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

Nümunə 2, xəttdə "bəli" yoxlayın (halda həssas):

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

Nümunə 3, xəttdə "bəli" olub (həssas halda):

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

Nümunə 4, xəttdə "bəli" yoxlayın (halda həssas):

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

Örnek 5, tam uyğunluq (böyük həssas):

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

Misal 6, tam uyğunluq (halda həssas):

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

Misal 7: tam eşleme:

  if [ "$a" = "$b" ] ;then 
5
28 мая '18 в 22:37 2018-05-28 22:37 Cavab Mike Q tərəfindən 28 May '18, saat 10:37 'də 2018-05-28 22:37' də verilir
 #!/bin/bash s1="hi" s2="hi" if [ "x$s1" == "x$s2" ] then echo match fi 

Əlavə bir xətt əlavə etmək daha təhlükəsiz edir.

Həm də tək əmrlər üçün digər qeydlərdən istifadə edə bilərsiniz:

 [ "x$s1" == "x$s2" ]  echo match 
2
25 нояб. cavab mpapis 25 noyabr verilir . 2010-11-25 16:47 '10 at 16:47 2010-11-25 16:47

Təmiz Bash ilə test versiyası üçün yox, yoxsa həqiqətən çirkin, cəhd edin:

 if ( exit "${s10}" )2>/dev/null then echo match fi 

Şərh: ( ) əlavə əlavə subshell açılır. Bir matç varsa 0'dan gedir və bir səhvi (çirkin) səbəb təsadüf olmasaydı $ s1-dən çıxmağa çalışır. Bu səhv /dev/null yönəldilmişdir.

2
20 февр. cavab user2546460 20 fevral. 2014-02-20 16:57 '14 da 16:57 2014-02-20 16:57