Как сравнить строки в Bash - PullRequest
847 голосов
/ 10 февраля 2010

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

Ответы [ 10 ]

1214 голосов
/ 10 февраля 2010

Использование переменных в операторах if

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

Если вы хотите что-то сделать, когда они не совпадают, замените = на !=. Вы можете прочитать больше о строковых операциях и арифметических операциях в их соответствующей документации.

Почему мы используем кавычки вокруг $x?

Вам нужны кавычки вокруг $x, потому что, если он пуст, ваш bash-скрипт обнаружит синтаксическую ошибку, как показано ниже:

if [ = "valid" ]; then

Нестандартное использование == оператора

Обратите внимание, что bash позволяет использовать == для равенства с [, но это не стандартно .

Используйте либо первый случай, когда кавычки вокруг $x являются необязательными:

if [[ "$x" == "valid" ]]; then

или используйте второй случай:

if [ "$x" = "valid" ]; then
130 голосов
/ 10 февраля 2010

Или, если вам не нужен еще пункт:

[ "$x" == "valid" ] && echo "x has the value 'valid'"
62 голосов
/ 14 августа 2015
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. > и < являются операторами перенаправления, поэтому избегайте их с \> и \< соответственно для строк.
58 голосов
/ 28 апреля 2013

Для сравнения строк с подстановочными знаками используйте

if [[ "$stringA" == *$stringB* ]]; then
  # Do something here
else
  # Do Something here
fi
31 голосов
/ 22 марта 2016

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

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

Нет, это не сумасшедший вкладчик

Это просто похоже на одного, хм, непосвященного ...

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

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

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

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

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

Каждая часть является логическим выражением; первое может быть истинным или ложным, два других всегда истинны.

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

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

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

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

20 голосов
/ 10 февраля 2010

Вы также можете использовать случай использования / ESAC

case "$string" in
 "$pattern" ) echo "found";;
esac
13 голосов
/ 21 июня 2016

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

пробел в 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
11 голосов
/ 04 декабря 2014

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

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

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

7 голосов
/ 19 сентября 2018

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

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

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

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

Пример 2, проверьте «да» в строке (без учета регистра):

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

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

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

Пример 4, проверьте «да» в строке (с учетом регистра):

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

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

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

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

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

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

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

наслаждаться.

1 голос
/ 22 марта 2018

Я сделал это таким образом, чтобы совместить с 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...