Вам сусла всегда поставить пробел в квадратных скобках в вашем if
заявления и что вы тестируете. Вы также должны понимать, что существуют два типа квадратных скобок: стандарт [ ... ]
и расширенный [[ ... ]]
.
[
на самом деле команда Unix, которая является псевдонимом для команды test
:
$ ls -li /bin/test /bin/[
54008404 -rwxr-xr-x 2 root wheel 18576 Jul 25 2012 /bin/[
54008404 -rwxr-xr-x 2 root wheel 18576 Jul 25 2012 /bin/test
Вы можете увидеть основные тесты, глядя на test
manpage.
И Kornshell (который начал его), и BASH дают вам расширенное испытание, используя двойные квадратные скобки ([[ ... ]]
). [[ ... ]]
в основном используется для pattern matching. Согласование шаблонов расширяет возможности подстановки, которые оболочка может выполнять в командной строке, - это выражение регулярного выражения бедного человека. Более новые версии BASH фактически позволяют использовать реальные регулярные выражения, а не соответствие шаблону.
Важно помнить, что вы должны использовать двойные квадратные скобки, когда вы проводите тестирование соответствия шаблону (или тестирование регулярных выражений в BASH), а не одиночные квадратные скобки, которые могут тестировать только строки.
помнить также, что регулярные выражения могут соответствовать любой точке на линии:
if [[ $SERIAL =~ "device" ]]
может соответствовать devices
. Что вы хотите сделать, так это добавить \b
, чтобы убедиться, что вы соответствуете слову device
. \b
регулярное выражение граничное слово:
if [[ $SERIAL =~ "\bdevice\b" ]]
1. Да, я знаю, что [
является оболочкой встроенной в BASH и Kornshell и [
не выполняет /bin/[
. Однако команда test
также является встроенной оболочкой.
Вы ищете устройства, серийный номер которых содержит подстроку «устройство» или только устройства с «устройством» в той же строке в выводах «adb devices» и устройствами, например «офлайн»? –