ksh проверяющая строка с логическим ИЛИ - PullRequest
3 голосов
/ 20 февраля 2012

Я пишу скрипт на ksh, который должен проверить, что для переменной задано одно из двух принятых значений. У меня есть следующий код, но когда я ввожу правильное значение, например, «C» Я получаю сообщение об ошибке (недопустимое значение):

if  [[ "$Mode" != "C" ]] || [[ "$Mode" != "M" ]] 
then

   echo ""
   echo "*Not a valid value*"

   exit 2;

fi

Я не уверен, почему это не помогает при сравнении строк, я пробовал различные варианты синтаксиса, но до сих пор нигде не получаю, любая помощь будет высоко ценится.

Ответы [ 3 ]

4 голосов
/ 20 февраля 2012

Ваша логика несовершенна.

if  [[ "$Mode" != "C" ]] && [[ "$Mode" != "M" ]] 
then

   echo ""
   echo "*Not a valid value*"

   exit 2;

fi
4 голосов
/ 20 февраля 2012
if ! [[  "$Mode" == "C" || "$Mode" == "M" ]] ; then
   echo ""
   echo "*Not a valid value*"
   exit 2;
fi

Я думаю, что это более простой способ проверки нескольких значений. Мне нравится думать об этом 'если Mode нет в списке C, или M, или ....; затем .... «Я вижу, как начинающий почтовый код похож на ваш (и я сделал это сам, когда был новичком), потому что тогда ваша ментальная модель -« если режим НЕ С, ИЛИ режим НЕ М, то ... », но вам, вам действительно нужно вместо «И» (как показано на jlliagre).

Надеюсь, это поможет.

1 голос
/ 26 февраля 2018

Годы спустя ...

Для тех, кто может следовать, логика причины амеров неверна: $ Mode - всегда либо не "C" ИЛИне «M», потому что даже значение типа «C» не является «M», что делает 2-е условие истинным.

Вот 2 однострочных варианта:

[[ $Mode != "C" && $Mode != "M" ]] && echo -e "\n*Not a valid value*" && exit 2

ЭтоАльтернатива bash позволяет легко и кратко добавить более допустимые значения:

[[ `echo $Mode | egrep "C|M"` ]] || echo -e "\n*Not a valid value*" && exit 2

Почему все пишут "$ Mode" вместо просто $ Mode?Попробуйте, прежде чем ответить, пожалуйста.

...