сравнить строки в Bash

Thank you for reading this post, don't forget to subscribe!

При напи­са­нии сце­на­ри­ев Bash вам часто нуж­но срав­ни­вать две стро­ки, что­бы про­ве­рить, рав­ны они или нет. Две стро­ки рав­ны, если они име­ют оди­на­ко­вую дли­ну и содер­жат оди­на­ко­вую после­до­ва­тель­ность символов.

Эта ста­тья опи­сы­ва­ет, как срав­ни­вать стро­ки в Bash.

 

Опе­ра­то­ры срав­не­ния – это опе­ра­то­ры, кото­рые срав­ни­ва­ют зна­че­ния и воз­вра­ща­ют true или false. При срав­не­нии строк в Bash вы може­те исполь­зо­вать сле­ду­ю­щие операторы:

  • string1 = string2 и string1 == string2- Опе­ра­тор равен­ства воз­вра­ща­ет true, если опе­ран­ды равны. 
    • Исполь­зуй­те =опе­ра­тор с test командой [.
    • Исполь­зуй­те ==опе­ра­тор с коман­дой [[ для сопо­став­ле­ния с образцом.
  • string1 != string2 – Опе­ра­тор нера­вен­ства воз­вра­ща­ет true, если опе­ран­ды не равны.
  • string1 =~ regex- Опе­ра­тор регу­ляр­но­го выра­же­ния воз­вра­ща­ет true, если левый опе­ранд соот­вет­ству­ет рас­ши­рен­но­му регу­ляр­но­му выра­же­нию справа.
  • string1 > string2 – Опе­ра­тор «боль­ше чем» воз­вра­ща­ет исти­ну, если левый опе­ранд боль­ше пра­во­го, отсор­ти­ро­ван­но­го по лек­си­ко­гра­фи­че­ско­му (алфа­вит­но­му) порядку.
  • string1 < string2 – Опе­ра­тор less than воз­вра­ща­ет true, если пра­вый опе­ранд боль­ше пра­во­го, отсор­ти­ро­ван­но­го по лек­си­ко­гра­фи­че­ско­му (алфа­вит­но­му) порядку.
  • -z string – Исти­на, если дли­на стро­ки рав­на нулю.
  • -n string – Исти­на, если дли­на стро­ки не рав­на нулю.

Ниже сле­ду­ет отме­тить несколь­ко момен­тов при срав­не­нии строк:

  • Пустое про­стран­ство долж­но быть исполь­зо­ва­но меж­ду бинар­ным опе­ра­то­ром и операндами.
  • Все­гда исполь­зуй­те двой­ные кавыч­ки вокруг имен пере­мен­ных, что­бы избе­жать каких-либо про­блем с раз­де­ле­ни­ем слов или сбоев.
  • Bash не раз­де­ля­ет пере­мен­ные по «типу», пере­мен­ные обра­ба­ты­ва­ют­ся как целое чис­ло или стро­ка в зави­си­мо­сти от контекста.

 

В боль­шин­стве слу­ча­ев при срав­не­нии строк вы хоти­те про­ве­рить, рав­ны ли стро­ки или нет.

Сле­ду­ю­щий скрипт исполь­зу­ет коман­ду [, что­бы про­ве­рить, сов­па­да­ют ли стро­ки с оператором =:

Когда скрипт выпол­нит­ся, он выве­дет сле­ду­ю­щий вывод.

Вот еще один скрипт, кото­рый при­ни­ма­ет вход­ные дан­ные от поль­зо­ва­те­ля и срав­ни­ва­ет задан­ные стро­ки. В этом при­ме­ре мы будем исполь­зо­вать коман­ду [[ и оператор ==.

Запу­сти­те скрипт и вве­ди­те стро­ки при появ­ле­нии запроса:

Вы так­же може­те исполь­зо­вать логи­че­ские и && и или || для срав­не­ния строк:

Есть несколь­ко спо­со­бов про­ве­рить, содер­жит ли стро­ка подстроку.

Один из под­хо­дов заклю­ча­ет­ся в исполь­зо­ва­нии под­стро­ки с сим­во­ла­ми звез­доч­ки *, что озна­ча­ет сов­па­де­ние всех символов.

Скрипт отоб­ра­зит следующее:

Дру­гой вари­ант – исполь­зо­вать опе­ра­тор регу­ляр­но­го выра­же­ния =~, как пока­за­но ниже:

Точ­ка, за кото­рой сле­ду­ет звез­доч­ка .* соот­вет­ству­ет нулю или боль­ше­му коли­че­ству вхож­де­ний любо­го сим­во­ла, кро­ме сим­во­ла новой строки.

 

Доволь­но часто вам так­же необ­хо­ди­мо про­ве­рить, явля­ет­ся ли пере­мен­ная пустой стро­кой или нет. Вы може­те сде­лать это, исполь­зуя опе­ра­тор -n и -z.

Вме­сто исполь­зо­ва­ния тесто­вых опе­ра­то­ров вы так­же може­те исполь­зо­вать опе­ра­тор case для срав­не­ния строк:

Лек­си­ко­гра­фи­че­ское срав­не­ние – это опе­ра­ция, в кото­рой две стро­ки срав­ни­ва­ют­ся в алфа­вит­ном поряд­ке путем срав­не­ния сим­во­лов в стро­ке после­до­ва­тель­но сле­ва напра­во. Этот вид срав­не­ния исполь­зу­ет­ся редко.

Сле­ду­ю­щие сце­на­рии срав­ни­ва­ют две стро­ки лексикографически:

Скрипт выве­дет следующее:

Сравнение строк Bash

Вот как вы срав­ни­ва­е­те стро­ки в Bash.

 

Вы так­же може­те исполь­зо­вать стро­ку напря­мую вме­сто исполь­зо­ва­ния переменной.

 

Поз­воль­те нам пока­зать это вам на примерах.

 

Проверьте, равны ли две строки

Если вы хоти­те про­ве­рить, рав­ны ли две стро­ки, вот пример:

 

Обра­ти­те вни­ма­ние на пространства
Меж­ду [име­нем пере­мен­ной и опе­ра­то­ром равен­ства == дол­жен быть про­бел. Если вы про­пу­сти­те какое-либо из про­бе­лов здесь, вы уви­ди­те ошиб­ку типа «ожи­да­ет­ся унар­ный опе­ра­тор» или отсутствует «]».

 

Проверьте, не равны ли строки в Bash

Вме­сто того, что­бы про­ве­рять каче­ство, давай­те сде­ла­ем обрат­ное и про­ве­рим нера­вен­ство. Bash так­же предо­став­ля­ет опе­ра­тор отри­ца­ния, так что вы може­те лег­ко исполь­зо­вать усло­вие «если не рав­но» в сце­на­ри­ях оболочки.

 

Пол­ный при­мер выгля­дит так:

 

Проверьте, является ли строка нулевой или пустой в Bash

В отли­чие от неко­то­рых дру­гих язы­ков, таких как C ++, в Bash вы може­те про­ве­рить, явля­ет­ся ли стро­ка пустой или пустой с помо­щью одной команды:

 

-z фак­ти­че­ски про­ве­ря­ет, рав­на ли дли­на пере­мен­ной нулю или нет. Если пере­мен­ная не уста­нов­ле­на ​​или если она пустая (рав­на «»), дли­на будет рав­на нулю и, сле­до­ва­тель­но, усло­вие вер­нет true.

Пол­ный при­мер мож­но уви­деть здесь:

 

При­ме­ча­ние об исполь­зо­ва­нии оди­нар­ных ско­бок ‘[]’ и двой­ных ско­бок ‘[[]]’ в скрип­тах bash

Вы так­же може­те исполь­зо­вать опе­ра­тор if с двой­ны­ми скоб­ка­ми, напри­мер так:

 

Оди­ноч­ная скоб­ка – это ста­рая кон­вен­ция Posix, и у нее есть неко­то­рые недо­стат­ки. Если вы не исполь­зу­е­те двой­ные кавыч­ки вокруг пере­мен­ных, а пере­мен­ная не опре­де­ле­на, она исчез­нет из кода и при­ве­дет к син­так­си­че­ской ошибке.

 

Если пере­мен­ная $ string1 пуста или не опре­де­ле­на в при­ве­ден­ном выше коде, эта стро­ка ста­нет эквивалентной