Я решил, что внесу ответ для сценария оболочки Bourne, поскольку синтаксис несколько своеобразен.
В традиционном/POSIX sh
проверка равенства строк является функцией команды [
(да, это отличное имя команды!), которая имеет некоторые надоедливые требования к цитированию и т. д.
#### WRONG
if [ "$v" != 'x' ] || [ "$v" != 'y'] || [ "$v" != 'z' ]; then
: some code which should happen when $v is not 'x' or 'y' or 'z'
fi
Современные оболочки, такие как Ksh, Bash, Zsh и т. Д., Также имеют [[
, что несколько менее надоедливо.
#### STILL WRONG
if [[ $v != 'x' || $v != 'y' || $v != 'z' ]]; then
: some code which should happen when $v is not 'x' or 'y' or 'z'
fi
Мы должны подчеркнуть требование иметь пробелы вокруг каждого токена, что многие новички упускают из виду (например, вы не можете сказать if[[$v
или $v!='y'
без пробелов вокруг команд и операторов), а также очевидную необязательность цитирования. . Неспособность заключить значение в кавычки часто не является синтаксической ошибкой, но приведет к серьезным нежелательным семантически проблемам, если вы не заключите в кавычки значение, которое должно быть заключено в кавычки. (Подробнее об этом в другом месте.)
Очевидным исправлением здесь является использование &&
вместо ||
, но вы также должны отметить, что [[
обычно поддерживает регулярные выражения, поэтому вы можете сказать что-то вроде
if [[ ! $v =~ ^(x|y|z)$ ]]; then
: yeah
fi
и не забывайте проверенный старый оператор case
, который вполне естественен для этого и переносим обратно в конец 1970-х:
case $v in
x | y | z)
;; # don't actually do anything in this switch
*) # anything else, we fall through to this switch
yeah
some more yeah
in fact, lots of yeah;;
esac
Замыкающие двойные точки с запятой сначала вызывают аневризмы, но вы быстро выздоравливаете и учитесь ценить и даже любить их. POSIX позволяет помещать открывающую круглую скобку перед выражением соответствия, чтобы у вас не было непарных правых круглых скобок, но такое использование встречается довольно редко.
(Очевидно, что это не подходящий ответ для оболочек Unix, которые не относятся к семейству Bourne. Семейство оболочек C, включая все еще довольно популярную tcsh
, использует синтаксис, который предположительно «C-подобный», но это все равно, что неспособность чтобы отличить Элиса Купера от девушки, которая отправилась в Страну Чудес, а у Раковины есть свои особенности, которые я даже не компетентен комментировать.)
person
tripleee
schedule
08.01.2018
if(var != “x” || var != “y” …)
. - person sampathsris   schedule 17.11.2015String
с==
и!=
(как вv != "x"
) некорректно. Нам нужно использовать.equals
вместо этого, как в!v.equals("x")
(или!"x".equals(v)
, еслиv
может бытьnull
). См. раздел Как сравнивать строки в Java? а> для получения дополнительной информации. - person Radiodef   schedule 22.09.2018