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 
  • объединить два файла csv на основе условия
  • Untar File.tar.gz из оболочки с вложенным .tar
  • Косая черта, не обнаруженная в команде «grep»
  • Как создать сценарий оболочки для установки докеров
  • хотите su без пароля внутри сценария оболочки
  • Bash удаляет все символы после шаблона с помощью awk
  • shell scripting - несколько тестов равенства в одном выражении if
  • файл шаблона в качестве входа в RS, FS в awk / sed / grep для распознавания и добавления столбцов
  • Извлечение символов после определенного текста
  • ассоциативный массив с двумя строками
  • Запуск сценария bash с двойным щелчком не содержит всех переменных среды
  • Interesting Posts

    Восстановление информации секционирования с блочных устройств

    Разрешения для общего каталога на сервере

    Где я могу найти исходный код для / bin / ip?

    Обрезать аудиофайл с использованием времени начала и остановки

    останов обслуживания не запускает часть выхода / очистки

    Список имен файлов, содержащих строку, которая встречается между двумя другими строками

    Как заблокировать одну пару мышь / клавиатуру на каждом экране?

    Я случайно изменил значок меню Linux Mint на нечто очень большое. Теперь я не могу изменить его назад

    Передача двоичных данных для завивки без использования @file

    Cron ежечасно работает в нечетные часы

    Как включить механизм объединения в пакет Debian MySQL?

    Установка mplayer в Linux

    Slow Maxtor / Seagate внешний жесткий диск

    Установите последние страницы руководства POSIX?

    Настройка, компиляция и установка пользовательского ядра Linux

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