IF для возврата true, если слово содержит конкретное письмо

Мне нужно, чтобы оператор if возвращал true, если слово содержит конкретную букву. Например:

var="information" if [ $var contain "i" ]; then .... else ... fi 

4 Solutions collect form web for “IF для возврата true, если слово содержит конкретное письмо”

Как насчет использования switch или case :

 #!/bin/sh v="information" case $v in *f*) echo "found \"f\" in ${v}";; *) echo "no match found in ${v}" esac exit 

Обратите внимание, что если игла хранится в переменной, важно процитировать ее, чтобы она не воспринималась как шаблон:

 case $haystack in *"$needle"*) echo match esac 

Без него, если бы $needle был * или ? например, это будет соответствовать любой стоге сена (и непустой стог сена соответственно).

В любом случае, $needle не должен быть единственным персонажем. Он будет работать с любой строкой.

Во многих оболочках он будет работать даже для любой последовательности ненулевых байтов, даже если они не образуют действительных символов, но не все могут разбить символы. Например, 0xc3 байт не может быть найден таким образом в строке é закодированной в UTF-8 (0xc3 0xa9) в некоторых реализациях. Напротив, некоторые оболочки могут найти i внутри ξ когда кодировка локали – это BIG5-HKSCS, где ξ кодируется как 0xa3 0x69 (и i – 0x69, как в ASCII).

Тест [[ ... ]] Bash знает о совпадениях шаблонов и регулярных выражениях:

Когда используются операторы == и != , Строка справа от оператора используется в качестве шаблона и сопоставления шаблонов. Когда используется оператор =~ , строка справа от оператора сопоставляется как регулярное выражение.

Так:

 s=information if [[ $s = *i* ]] ; then echo has i ; fi 

Цитированные строки берутся буквально:

 if [[ $s = "*i*" ]] ; then echo is i between two asterisks ; fi 

И он знает о регулярных выражениях

 if [[ $s =~ ^.*i.*$ ]] ; then echo has i ; fi 

Хотя, как обычно, это принимает также совпадения, которые не заполняют всю строку:

 if [[ $s =~ i ]] ; then echo has i ; fi 

Старый (и довольно портативный) способ сделать это – использовать case case:

 var="information" case $var in *i*) echo "An 'i' was found in $var";; * ) echo "There is no 'i' in $var";; esac 

Как однострочная функция:

 a="information" b="i" one(){ case $a in (*${b}*) true;; (*) false;; esac; } 

И используется с:

 if one; then echo "Found %b in $a"; else echo "The character '$b' was not found in the string '$a'" fi 

Другие допустимые способы выполнения одного и того же теста:

 two(){ [[ $a == *"$b"* ]] ; } # Using a pattern match. t33(){ [[ $a =~ "$b" ]] ; } # Extended Regex (ERE) match. f44(){ [[ $a =~ ^.*"$b".*$ ]] ; } # Using a ERE with limits. f55(){ [[ ${a//[!"${b}"]} ]] ; } # Removing all non-matching chars. six(){ [ ! "$a" = "${a%"$b"*}" ] ; } # Using char removal. s77(){ [[ $a =~ ^.*$ ]] ; } # Testing if string is valid. 

Все функции работают с действительными строками.
Время каждой функции для строк из 10, 100, 1000, …, 1000000 (1 миллион) символов приведено ниже:

  Number of characters in the string. 10 100 1000 10000 100000 1000000 one 0.024m 0.036m 0.047m 0.207m 2.117m 25.363m two 0.028m 0.030m 0.043m 0.179m 2.081m 25.337m t33 0.044m 0.041m 0.053m 0.151m 1.757m 22.695m f44 0.064m 0.075m 0.241m 1.864m 19.489m 198.488m f55 0.055m 0.182m 5.275m 421.886m six 0.043m 0.057m 0.297m 13.987m s77 0.056m 0.061m 0.154m 1.201m 12.749m 134.774m 

Количество символов создается путем повторения символа.
Строка, подлежащая тестированию, построена с чем-то вроде:

 a="$1$(repeat "$2" 10**$k)$3" 

Сценарий называется:

 $ ./script start a ending 

Функция f55 становится очень медленной, если размер обрабатываемой строки превышает f55 (около 1000 символов). То же самое происходит с функцией six для строк длиной более (около) 10000 (10k) символов.

Функция two является более быстрой для коротких строк, а t33 (regex) является лучшим для более длинных строк.

Функции t33 – s77 изменяют время работы, если они выполняются как:

 $ LANG=C ./script 

Все становится быстрее.

Интересно отметить, что функции f44 и s77 сообщают об ошибке * output false), если тестируемая строка является недопустимой строкой utf-8, например:

 $'\x80abcde' 

Точно так же, как grep (базовая команда для регулярного выражения) (в локали utf-8):

 $ echo $'\x80abcde' | grep '^.*$' # no output $ (LANG=C; echo $'\x80abcde' | grep '^.*$')  abcde 

В условиях [[ ... ]] правая часть сравнения работает как шаблон.

 if [[ $var == *i* ]] ; then 
  • Создать каталог для каждой строки в данном текстовом файле?
  • Увеличение переменной с помощью скрипта Bash
  • Скрипт для переключения setxkbmap
  • Сценарий оболочки для преобразования PDF в изображения и сохранения в подпапке
  • Сценарий Bash для подключения к интернету Teletalk
  • Удалить строки из файла в зависимости от строк, найденных в другом файле
  • выполнение команд в оболочке и отключение отображения команд по умолчанию в консоли
  • Получить статус mongodb
  • Присвоение нового значения непосредственно в индекс символа значения в массиве с zsh
  • Прикрепленное изображение отсутствует в почте Unix при прикреплении нескольких файлов
  • синтаксическая ошибка возле неожиданного токена `<'
  • Interesting Posts

    Фоновые процессы смешивают порядок выполнения сценария оболочки

    Полноэкранный режим CentOS 7 не работает в VirtualBox

    Как прозрачно включить ccache для нескольких наборов инструментов?

    Виртуальная консоль TTY + tmux: кажется, что ~ / .bashrc запускается более одного раза?

    Является ли ядро ​​mainline Linux способным программировать GPGPU?

    У zsh есть проблема со звездочкой в ​​длинном пути с пробелом в имени на Mac

    Как удаленно выполнить команду ssh команду sudo без пароля

    Вы можете сортировать один столбец лексикографически, одновременно сортируя следующий столбец численно?

    Получение пустых данных при чтении текстового файла и отправка данных чтения в url cURL в linux

    Такое же меню grub для двух дистрибутивов GNU / Linux

    разрешение отклонено для mpicc

    печатать все после косой черты

    найти, какой процесс отправляет текущий запрос io в ядре linux

    почему я получаю «причина: этот сервер не требует аутентификации» в xpra

    добавление PATH для кучи программ

    Linux и Unix - лучшая ОС в мире.