2013-12-23 2 views
5
s="STP=20" 

if [[ "$x" == *"$s"* ]] 

Условие if всегда неверно; Зачем?Как сравнить две строки, если условие в bash

+1

Что такое значение '$ x'? – anubhava

+0

Попробуйте 'echo '$ x" 'перед оператором' if'. Эта строка кода работает должным образом. – starrify

+0

спасибо. моя переменная x назначается awk x = $ (awk '{printf "% s", $ 17}' this) - Sanchai_28 35 secs назад edit – Sanshayan

ответ

2

Попробуйте это: http://tldp.org/LDP/abs/html/comparison-ops.html

string comparison 

= 

    is equal to 

    if [ "$a" = "$b" ] 
+0

спасибо. my x variable присваивается awk x = $ (awk '{printf "% s", $ 17}' this) – Sanshayan

+1

Я помню, что '==' также работает для сравнения, и нет никакой разницы между '=' и '=='. – starrify

+1

Существует разница, если вы используете '' [] '' (и вы не должны этого делать, пожалуйста, предпочитайте '' [[]] ''). '' = '' и '' == '' работают точно так же внутри '' [[]] '' условно, но только '' = '' доступно в '' [] ''. См. [This] (http://mywiki.wooledge.org/BashFAQ/031) и [это] (http://mywiki.wooledge.org/Bashism) для получения дополнительной информации. –

-1

Вам нужно бежать = с помощью \ в строке s="STP=20"

s="STP\=20" 

if [[ "STP\=20" == "$s" ]]; then echo Hi; else echo Bye; fi 
+0

's =" STP = 20 "&& if [[" STP = 20 "==" $ s "]]; затем echo Hi; else echo Bye; fi' также дает 'Hi' – starrify

+0

Спасибо !!!!!! Работает – Sanshayan

+0

@ Sanchai_28 Я рад! –

0

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

if test "$x" = "$y"; then 
    printf '%s\n' "equal" 
else 
    printf '%s\n' "not equal" 
fi 

Чтобы проверить, появляется ли x где-то в y, используйте

case $y in 
    (*"$x"*) 
     printf '%s\n' "$y contains $x" 
     ;; 
    (*) 
     printf '%s\n' "$y does not contain $x" 
     ;; 
esac 

Обратите внимание, что эти конструкции являются портативными к любой POSIX оболочки, а не только Баш. Конструкция [[ ]] для тестов еще не является стандартной оболочкой.

0

Я не знаю, откуда вы пришли с *, но вы были очень близко:

s="STP=20" 
if [[ "STP=20" == "$s" ]]; then 
    echo "It worked!" 
fi 
+0

'bash' позволяет совпадать с шаблоном внутри' [[', поэтому исходный код OP должен оцениваться как true, если' $ x' содержит '$ s' в качестве подстроки. – chepner

4

Существует разница в тестировании равенства между [ ... ] и [[ ... ]].

[ ... ] является псевдонимом команды test:

СТРОКА1 = СТРОКА2 строки равны

Однако при использовании [[ ... ]]

Когда == и !=, строка для ri ght оператора считается шаблоном и согласовывается в соответствии с правилами, описанными ниже в разделе Match Matching. Если опция nocasematch оболочки включена, совпадение выполняется независимо от случая с алфавитными символами. Возвращаемое значение равно 0, если строка соответствует (==) или не соответствует (!=) шаблону, а 1 - в противном случае. Любая часть шаблона может быть процитирована, чтобы заставить ее соответствовать строке.

То же самое, кажется, верно только с = знака:

$ foo=bar 
$ if [[ $foo = *ar ]] 
> then 
>  echo "These patterns match" 
> else 
>  echo "These two strings aren't equal" 
> fi 
These patterns match 

Примечание разница:

$ foo=bar 
> if [ $foo = *ar ] 
> then 
>  echo "These patterns match" 
> else 
>  echo "These two strings aren't equal" 
> fi 
These two strings aren't equal 

Однако, есть несколько ловушек с синтаксисом [ $f00 = *ar ]. Это то же самое, что и:

test $foo = *ar 

Это означает, что оболочка будет интерполировать выражения и переменные glob перед выполнением инструкции.Если $foo пуст, то команда будет эквивалентна:

test = *ar # or [ = *ar ] 

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

bash: [: =: unary operator expected 

Что означает [ ожидал параметр, найденный в справочной странице test.

И, если я, случается, есть файл bar в моем каталоге, оболочка заменит *ar со всеми файлами, которые соответствуют этому шаблону (в данном случае bar), так что команда будет:

[ $foo = bar ] 

что является правдой.

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

[ "$foo" = "*ar" ] 

Это будет проверить, является ли переменная $foo равна строке *ar. Он будет работать, даже если $foo пуст, потому что кавычки будут вынуждать пустую строку сравнения. Котировки вокруг *ar не позволят оболочке интерполировать глобус. Это истинное равенство.

Конечно, просто так получилось, что если вы используете кавычки при использовании [[ ... ]], вы заставите струнный матч тоже:

foo=bar 
if [[ $foo == "*ar" ]] 
then 
    echo "This is a pattern match" 
else 
    echo "These strings don't match" 
fi 

Таким образом, в конце концов, если вы хотите test для равенства строк, вы можете использовать либо [ ... ], либо [[ ... ]], но вы должны указать свои параметры. Если вы хотите выполнить сопоставление шаблонов шаров, вы должны опустить кавычки и использовать [[ ... ]].

Смежные вопросы