Как найти подстроку внутри строки (или как grep переменную)?

Я использую BASH, и я не знаю, как найти подстроку. Он продолжает терпеть неудачу, у меня есть строка (должен ли это быть массив?)

Ниже LIST представляет собой строковый список имен баз данных, SOURCE - это ответ, одна из этих баз данных. Следующие действия все еще не работают:

echo "******************************************************************"
echo "*                  DB2 Offline Backup Script                     *"
echo "******************************************************************"
echo "What the name of of the  database you would like to backup?"
echo "It will be named one in this list:"
echo ""
LIST=`db2 list database directory | grep "Database alias" | awk '{print $4}'`
echo $LIST
echo ""
echo "******************************************************************"
echo -n ">>> "
read -e SOURCE

if expr match "$LIST" "$SOURCE"; then
    echo "match"
    exit -1
else
    echo "no match"
fi
exit -1

Я тоже пробовал это, но не работал:

if [ `expr match "$LIST" '$SOURCE'` ]; then
+20
источник поделиться
8 ответов
LIST="some string with a substring you want to match"
SOURCE="substring"
if echo "$LIST" | grep -q "$SOURCE"; then
  echo "matched";
else
  echo "no match";
fi
+41
источник

Вы также можете сравнить с подстановочными знаками:

if [[ "$LIST" == *"$SOURCE"* ]]

+21
источник

Если вы используете bash, вы можете просто сказать

if grep -q "$SOURCE" <<< "$LIST" ; then
    ...
fi
+5
источник

Это работает в Bash без внешних команд:

function has_substring() {
   [[ "$1" != "${2/$1/}" ]]
}

Пример использования:

name="hello/world"
if has_substring "$name" "/"
then
   echo "Indeed, $name contains a slash!"
fi
+3
источник

Вы можете использовать "индекс", если хотите найти только один символ, например:

LIST="server1 server2 server3 server4 server5"
SOURCE="3"
if expr index "$LIST" "$SOURCE"; then
    echo "match"
    exit -1
else
    echo "no match"
fi

Выход:

23
match
+1
источник
expr match "$LIST" '$SOURCE'

не работает из-за этой функции ищет $SOURCE от начала строки и возвращает позицию сразу после шаблона $SOURCE, если найдено else 0. Поэтому вы должны написать еще один код:

expr match "$LIST" '.*'"$SOURCE" or expr "$LIST" : '.*'"$SOURCE"

Выражение $SOURCE должно быть двойным, так как синтаксический анализатор может установить замену. Одиночная цитата не подставляется, и код выше будет искать текстовую строку $SOURCE с начала $LIST. Если вам нужно, чтобы начало строки вычитало длину $SOURCE, например ${# SOURCE}. Вы также можете написать

expr "$LIST" : ".*\($SOURCE\)"

Эта функция просто извлекает $SOURCE из $LIST и возвращает ее. Вы получите пустую строку. Но проблема с двойной двойной кавычкой. Я не знаю, как это решить без использования дополнительной переменной. Это легкое решение. Таким образом, вы можете написать на C. Существует готовая функция strstr. Не используйте индекс expr, так что это очень привлекательно. Но индексный поиск не подстрока и только первый char.

+1
источник

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

if expr match "$LIST" "$SOURCE"; then

Но я не совсем понимаю, что должен представлять SOURCE.

Похоже, ваш код будет читаться в шаблоне со стандартного ввода и выходить, если он соответствует псевдониму базы данных, иначе он будет эхом "ok". Это то, что вы хотите?

0
источник

Что ж, как насчет этого:

PS3="Select database or <Q> to quit: "
select DB in db1 db2 db3; do
   [ "${REPLY^*}" = 'Q' ] && break
   echo "Should backup $DB..."
done
0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос