Прочитайте, что для сравнения строк внутри if
мы должны использовать двойные квадратные скобки. В некоторых книгах говорится, что сравнение может быть сделано =
. Но это работает с ==
тоже.
#!/bin/bash
a="hello"
b="world"
if [[ $a == $b ]];then
echo "equal"
fi
Есть ли разница между =
и ==
в сравнении?
bash
shell-script
user3539
источник
источник
=
для[
.==
для[[
.==
, почему вы должны использовать=
(равенство) с[
и==
(сопоставление с образцом с семантикой, поддерживающей цитирование) с[[
. Смhelp test
противhelp [[
.[ foo == foo ] && echo foo
безусловно, печатаетfoo
, указывая, что==
работает с[
. Тем не менее, если под «это означает» вы подразумеваете «был предназначен для использования с», то у меня меньше возражений.[[
Тот факт, что bash воспринимает это как удобство, не означает, что он рекомендуется - если вы все-таки отказываетесь от переносимости, просто используйте во-первых, у которого значительно более детальное понимание токенизации, разбиения слов и т. Д.Ответы:
[[ $a == $b ]]
это не сравнение, это сопоставление с образцом. Вам нужно[[ $a == "$b" ]]
сравнить байтовое равенство.=
такой же, как и==
в любой поддерживаемой оболочке[[...]]
(представленнойksh
).[[...]]
это не стандартныйsh
синтаксис.[
Команда является стандартной, и стандартным сравнением оператора есть=
(хотя некоторые[
реализации также признают==
).Как и в любом аргументе любой команды, переменные должны быть заключены в кавычки, поэтому:
В стандарте
sh
сопоставление с образцом выполняется с помощьюcase
:Для полноты, другие похожие на равенство операторы вы можете встретить в сценариях оболочки:
[ "$a" -eq "$b" ]
: стандартный[
оператор для сравнения десятичных целых чисел. Некоторые[
реализации допускают пробелы вокруг чисел, некоторые допускают произвольные арифметические выражения, но это не переносимо. Портативно, можно использовать[ "$((a))" -eq "$((b))" ]
для этого. Смотрите также,[ "$((a == b))" -ne 0 ]
какой будет стандартный эквивалент (за исключением того, что POSIXly, поведение указывается, только если$a
и$b
содержат целочисленные константы) из:((a == b))
, из ksh и также найденный вzsh
иbash
, возвращает true, если оценка арифметического выражения, сохраненного в,$a
дает то же число, что и у$b
. Как правило, это используется для сравнения чисел. Обратите внимание, что между оболочками существуют различия в том, как оцениваются арифметические выражения и какие числа поддерживаются (например, bash и некоторые реализации / версии ksh не поддерживают числа с плавающей запятой или обрабатывают числа с ведущими нулями как восьмеричные).expr "$a" = "$b"
выполняет сравнение чисел, если оба операнда распознаются как десятичные целые числа (некоторые допускают пропуски вокруг числа), и в противном случае проверяет, имеют ли два строковых оператора одинаковый порядок сортировки. Это также не удалось бы для значений$a
или$b
такихexpr
операторов, как(
,substr
...awk 'BEGIN{exit !(ARGV[1] == ARGV[2])}' "$a" "$b"
: если$a
и$b
распознаются как числа (по крайней мере десятичное целое число и числа с плавающей запятой, такие как 1.2, -1.5e-4, начальные конечные пробелы игнорируются, некоторые также распознают шестнадцатеричное, восьмеричное или что-либо еще, распознаваемоеstrtod()
), то выполняется числовое сравнение. В противном случае, в зависимости от реализации, это либо байт в байт сравнение строк, или как дляexpr
болееstrcoll()
сравнения, то есть ли$a
и$b
вроде то же самое.Смотрите также:
источник
Это эквивалентно в bash:
Первые две переменные $ x не нужно заключать в кавычки. Bash выполняет разбиение слов и расширение пути внутри [но не внутри [[:
[[ $x = "$y" ]]
это сравнение строк, но[[ $x = $y ]]
это выражение соответствия шаблону:-eq предназначен только для использования с целыми числами:
См. Также BashFAQ / 031: В чем разница между тестом [и [[? ,
источник