Как проверить, содержит ли строка подстроку в Bash

Вы можете посмотреть на использование System.Management (WMI). С этим вы можете запросить дерево Win32_Process.

2238
задан codeforester 3 August 2018 в 18:34
поделиться

7 ответов

Можно использовать ответ Marcus (* подстановочные знаки) внешняя сторона оператор выбора также при использовании двойных скобок:

string='My long string'
if [[ $string == *"My long"* ]]; then
  echo "It's there!"
fi

Примечание, которое располагает с интервалами в строке иглы, должно быть помещено между двойными кавычками, и эти *, подстановочные знаки должны быть снаружи.

3192
ответ дан Teemu Leisti 3 August 2018 в 18:34
поделиться
  • 1
    Я предпочитаю Google Collections потому что Apache палата общин doesn' t поддерживают дженерики. – Michael Myers♦ 26 June 2009 в 16:10

Принятый ответ является лучшим, но так как существует больше чем один способ сделать это, вот другое решение:

if [ "$string" != "${string/foo/}" ]; then
    echo "It's there!"
fi

${var/search/replace} $var с первой инстанцией search заменены replace, если это найдено (это не изменяется $var). При попытке заменить foo ничем, и строка изменилась, то, очевидно foo был найден.

88
ответ дан Steven Penny 3 August 2018 в 18:34
поделиться
  • 1
    Я думаю, что часть точки здесь как é tude: исследование. – Charlie Martin 5 January 2009 в 02:40

Необходимо помнить, что сценарии оболочки являются меньшим количеством языка и большим количеством набора команд. Инстинктивно Вы думаете, что этот "язык" требует, чтобы Вы следовали if с [ или [[. Оба из тех являются просто командами, которые возвращают статус выхода, указывающий на успешность или неуспешность (точно так же, как любая команда). По этой причине я использовал бы grep, а не эти [ команда.

Просто сделайте:

if grep -q foo <<<"$string"; then
    echo "It's there"
fi

Теперь, когда Вы думаете if как тестирование статуса выхода команды, которая следует за ним (вместе с точкой с запятой). Для почему бы не пересмотра источника строки, Вы тестируете?

## Instead of this
filetype="$(file -b "$1")"
if grep -q "tar archive" <<<"$filetype"; then
#...

## Simply do this
if file -b "$1" | grep -q "tar archive"; then
#...

-q опция заставляет grep не произвести что-либо, поскольку мы только хотим код возврата. <<< заставляет оболочку развернуть следующее слово и использовать его в качестве входа к команде, короткой версии << здесь документ (я не уверен, стандартно ли это или bashism).

140
ответ дан tripleee 3 August 2018 в 18:34
поделиться
  • 1
    can' t даже отображающий, почему за это вниз проголосовали, даже для домашней работы it' s допустимый и самый эффективный совет здесь... – Ilya 5 January 2009 в 08:08

Если Вы предпочитаете подход regex:

string='My string';

if [[ $string =~ "My" ]]
then
   echo "It's there!"
fi
497
ответ дан mdaoust 3 August 2018 в 18:34
поделиться
  • 1
    О, я вижу, извините для того, чтобы не понимать это! Очень хороший ответ! – Filip Ekberg 5 January 2009 в 00:47

Я не уверен в использовании, если оператор, но можно получить подобный эффект с оператором выбора:

case "$string" in 
  *foo*)
    # Do stuff
    ;;
esac
307
ответ дан Marcus Griep 3 August 2018 в 18:34
поделиться
  • 1
    Очень хорошие взгляды. Как Вы предложили бы, чтобы Вы обработали каждую строку? Предположите, что строка кулака могла бы быть PORT=1000, Вы так или иначе создадите функцию, которая возвратила бы ту строку и значение как структура? Это могло бы быть большим количеством основных принципов о " architecture" чем чистый " как to". – Filip Ekberg 5 January 2009 в 01:02

grep -q полезно с этой целью.

то же использование awk:

string="unix-bash 2389"
character="@"
printf '%s' "$string" | awk -vc="$character" '{ if (gsub(c, "")) { print "Found" } else { print "Not Found" } }'

Вывод:

Не Найденный

string="unix-bash 2389"
character="-"
printf '%s' "$string" | awk -vc="$character" '{ if (gsub(c, "")) { print "Found" } else { print "Not Found" } }'

Вывод:

Найденный

Первоисточник: http://unstableme.blogspot.com/2008/06/bash-search-letter-in-string-awk.html

5
ответ дан nyuszika7h 4 August 2018 в 04:34
поделиться
  • 1
    Действительно поздно для регистрации этого но это может обработать хорды? Я мог бы реализовывать это в своем программном обеспечении, если оно может... – Blender 20 November 2010 в 04:16

Как насчет этого:

text="   <tag>bmnmn</tag>  "
if [[ "$text" =~ "<tag>" ]]; then
   echo "matched"
else
   echo "not matched"
fi
17
ответ дан bn. 4 August 2018 в 04:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: