Как сравнить строки в Bash

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

10 ответов


попробуйте это:

if [ "$x" = "valid" ]; then
  echo "x has the value 'valid'"
fi

если вы хотите сделать что-то, когда они не совпадают, замените = С !=. Вы хотите, чтобы цитаты вокруг $x, потому что если $x пусто, вы получите if [ = "valid" ]... что является синтаксической ошибкой.


отметим, что bash позволяет == для использования с [, но это не стандарт. Либо используйте [[ "$x" == "valid" ]] (в этом случае кавычки $x не являются обязательными) или [ "$x" = "valid" ].


или, если вам не нужно предложение else:

[ "$x" == "valid" ] && echo "x has the value 'valid'"

Для сравнения строк с помощью шаблонов использовать

if [[ "$stringA" == *$stringB* ]]; then
  # Do something here
else
  # Do Something here
fi

a="abc"
b="def"

# Equality Comparison
if [ "$a" == "$b" ]; then
    echo "Strings match"
else
    echo "Strings don't match"
fi

# Lexicographic (greater than, less than) comparison.
if [ "$a" \< "$b" ]; then
    echo "$a is lexicographically smaller then $b"
elif [ "$a" \> "$b" ]; then
    echo "$b is lexicographically smaller than $a"
else
    echo "Strings are equal"
fi

Примечания:

  1. пробелы между if и [ и ] важны
  2. > и < операторы перенаправления так избежать его с \> и \< соответственно для строк.

Я должен не согласиться с одним из комментариев в одном пункте:

[ "$x" == "valid" ] && echo "valid" || echo "invalid"

нет, это не сумасшедший oneliner

это просто похоже на, хм, непосвященных...

он использует общие шаблоны в качестве языка, в некотором роде;

и после того, как вы выучили язык.

на самом деле, приятно читать

это простое логическое выражение, с одной специальной частью: ленивая оценка логики операторы.

[ "$x" == "valid" ] && echo "valid" || echo "invalid"
(
[ "$x" == "valid" ] 
&&
echo "valid"
)
||
echo "invalid"

теперь, когда он оценивается, первый проверяется. Если это ложь, то второй операнд логики и && после этого не имеет значения. Первое не является истинным, поэтому оно не может быть первым, а второе-истинным.
Теперь, в этом случае это первая сторона логики или || false, но это может быть правдой, если другая сторона - третья часть - это правда.

таким образом, третья часть будет оценена - в основном написание сообщения в качестве побочного эффекта. (Он имеет результат 0 для true, который мы здесь не используем)

другие случаи похожи, но проще - и - я обещаю! are-can be-легко читать!
(У меня его нет, но я думаю, что ветеран UNIX с седой бородой очень помогает этот.)


вы также можете использовать use case / esac

case "$string" in
 "$pattern" ) echo "found";;
esac

следующий скрипт читает из файла с именем "testonthis" строка за строкой, затем сравнивает каждую строку с простой строкой, строкой со специальными символами и регулярным выражением, если она не соответствует, то скрипт будет печатать строку o/w нет.

пространство в bash настолько важно. так что следующее будет работать

[ "$LINE" != "table_name" ] 

но не:

["$LINE" != "table_name"] 

поэтому, пожалуйста, используйте как это:

cat testonthis | while read LINE
do
if [ "$LINE" != "table_name" ] && [ "$LINE" != "--------------------------------" ] && [[ "$LINE" =~ [^[:space:]] ]] && [[ "$LINE" != SQL* ]]; then
echo $LINE
fi
done

Я бы, вероятно, использовал совпадения с регулярным выражением, если на входе есть только несколько допустимых записей. Например. допустимыми являются только действия" start "и" stop".

if [[ "${ACTION,,}" =~ ^(start|stop)$ ]]; then
  echo "valid action"
fi

обратите внимание, что я строчной переменной $ACTION С помощью двойной запятой. Также обратите внимание, что это не будет работать на слишком старых версиях bash.


Bash4+ примеры. Примечание: не использование кавычек вызовет проблемы, когда слова содержат пробелы и т. д.. Всегда цитируйте в bash IMO.

вот несколько примеров BASH4+:

Пример 1, Проверьте " да " в строке (без учета регистра):

    if [[ "${str,,}" == *"yes"* ]] ;then

Пример 2, Проверьте " да " в строке (с учетом регистра):

    if [[ "$(echo "$str" | tr '[:upper:]' '[:lower:]')" == *"yes"* ]] ;then

Пример 3, Проверьте " да " в строке (с учетом регистра):

     if [[ "${str}" == *"yes"* ]] ;then

Пример 4, Проверьте " да " в строке (case sensitive):

     if [[ "${str}" =~ "yes" ]] ;then

Пример 5, точное совпадение (с учетом регистра):

     if [[ "${str}" == "yes" ]] ;then

Пример 6, точное совпадение (без учета регистра):

     if [[ "${str,,}" == "yes" ]] ;then

Пример 7, точное совпадение:

     if [ "$a" = "$b" ] ;then

наслаждайтесь.


Я сделал это таким образом, который совместим с bash, dash (sh):

testOutput="my test"
pattern="my"

case $testOutput in (*"$pattern"*)
    echo "if there is a match"
    exit 1
    ;;
(*)
   ! echo there is no coincidence!
;;esac