Довольно частой задачей является узнать, встречается ли в строке какое-нибудь слово или же, в более общем случае, подстрока.
Для решения можно воспользоваться внутренними механизмами bash, но я покажу более башенезависимый способ, с помощью grep
. Благо он есть практически везде, даже в каких-нибудь системах, основанных на BusyBox, а вот вместо bash может встретится и просто sh, и что-нибудь более экзотическое.
Предположим, что в переменной STR
имеется строка:
STR="cat lynx lion coguar"
В переменную SUBSTR
запишем первый параметр командной строки скрипта ($1
):
SUBSTR="$1"
Выводим содержимое переменной $STR
, передаем вывод grep
с нужными параметрами, а результат сохраняем в переменную-счетчик:
CNTR=`echo "$STR" | grep -w -c "$SUBSTR"`
В данной команде более всего интересны параметры grep
:
-w
— искать целое слово.
Примечание: Словом по умолчанию считается все, что отделено от других символов пробелом(-ами) табуляцией(-ами) или переводом(-ами) строки.
-с
— подсчитать количество строк с нужным вхождением
Примечание: Ключ -с
заставляет grep
подсчитывать строки, а не сами вхождения, так что количество вхождений слова в строку, так посчитать не получится.
В итоге в переменной CNTR
оказывается 0
, если совпадений нет, и 1
, если совпадение есть, остается только проверить:
if [ "$CNTR" -ne 0 ];then echo "Exist" else echo "Not exist" fi
Примеры работы:
./exist-word lion
Вывод:
Exist
./exist-word dog
./exist-word li
Вывод:
Not exist
Под подстрокой имеется любой набор символов, идущих подряд.
Задача решается аналогично предыдущей, только из параметров grep
удаляется ключ -w
Если из вышеуказанного скрипта удалить ключ -w
grep
‘а, то вывод будет таким:
./exist-word li
Вывод:
Exist
Т.е. теперь была найдена подстрока li
(часть слова lion
).