s="STP=20"
if [[ "$x" == *"$s"* ]]
Условие if
всегда неверно; Зачем?Как сравнить две строки, если условие в bash
s="STP=20"
if [[ "$x" == *"$s"* ]]
Условие if
всегда неверно; Зачем?Как сравнить две строки, если условие в bash
Попробуйте это: http://tldp.org/LDP/abs/html/comparison-ops.html
string comparison
=
is equal to
if [ "$a" = "$b" ]
спасибо. my x variable присваивается awk x = $ (awk '{printf "% s", $ 17}' this) – Sanshayan
Я помню, что '==' также работает для сравнения, и нет никакой разницы между '=' и '=='. – starrify
Существует разница, если вы используете '' [] '' (и вы не должны этого делать, пожалуйста, предпочитайте '' [[]] ''). '' = '' и '' == '' работают точно так же внутри '' [[]] '' условно, но только '' = '' доступно в '' [] ''. См. [This] (http://mywiki.wooledge.org/BashFAQ/031) и [это] (http://mywiki.wooledge.org/Bashism) для получения дополнительной информации. –
Для сравнения двух строк в переменных 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 оболочки, а не только Баш. Конструкция [[ ]]
для тестов еще не является стандартной оболочкой.
Я не знаю, откуда вы пришли с *
, но вы были очень близко:
s="STP=20"
if [[ "STP=20" == "$s" ]]; then
echo "It worked!"
fi
'bash' позволяет совпадать с шаблоном внутри' [[', поэтому исходный код OP должен оцениваться как true, если' $ x' содержит '$ s' в качестве подстроки. – chepner
Существует разница в тестировании равенства между [ ... ]
и [[ ... ]]
.
[ ... ]
является псевдонимом команды 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 для равенства строк, вы можете использовать либо [ ... ]
, либо [[ ... ]]
, но вы должны указать свои параметры. Если вы хотите выполнить сопоставление шаблонов шаров, вы должны опустить кавычки и использовать [[ ... ]]
.
Что такое значение '$ x'? – anubhava
Попробуйте 'echo '$ x" 'перед оператором' if'. Эта строка кода работает должным образом. – starrify
спасибо. моя переменная x назначается awk x = $ (awk '{printf "% s", $ 17}' this) - Sanchai_28 35 secs назад edit – Sanshayan