2016-03-29 4 views
0

Что я здесь делаю неправильно? Скрипт по умолчанию входит в этот оператор IF & отображает вывод эха для выхода.Если сравнение строк строки

#!/bin/ksh 


server=$1 
dbname=$2 
IFS=" 
" 
if [[ "${dbname}" != "abc_def_data" || "${dbname}" != "abc_def01_data" ]]; then 
     echo "Msg: Triggers can only be applied to CMS_JAD:abc_def_data/abc_def01_data!" 
     exit 0 
fi 
+0

Вы никогда не используете $ server, это намеренно? – Daniele

+1

Условие всегда верно. – Mithrandir

+0

Я только скопировал часть кода ... $ server будет использоваться позже в скрипте ... @Daniele – MRKR

ответ

0

Вы случайно не хотели писать?

if [[ "${dbname}" != "abc_def_data" && "${dbname}" != "abc_def01_data" ]]; then 
     echo "Msg: Triggers can only be applied to CMS_JAD:abc_def_data/abc_def01_data!" 
     exit 0 
fi 
+0

Я запутался здесь ... Я хочу, чтобы сценарий вышел, если имя dbname не равно ни abc_def_data, ни abc_def01_data. – MRKR

+0

И почему? – Mithrandir

+0

Потому что это моя потребность. У сценария есть задача, и его необходимо применять к определенному набору «dbname». – MRKR

1

Цепочка != условий требует некоторой инверсии мышления.

Я предпочитаю более четкий путь к тестированию этих условий с использованием структуры case ... esac.

case "${dbname}" in 
    abc_def_data|abc_def01_data) 
     #dbg echo "matched, but for real code replace with just a ':' char" 
     : 
    ;; 
    *) 
     echo "didn_t match any expected values for \$dbname" 
     echo exit 1 
    ;; 
esac 

Обратите внимание, что, как вы на самом деле пытаетесь найти *) случая, действия для abc_def_data (etc) матча может быть что угодно, но только перейти к следующему разделу коды, вам нужен будет только неопределенный ЦМД оболочечного :.

Edit 1

Обратите внимание, что у меня есть echo exit 1, просто так, если копировать/вставить это в командной строке, ваша оболочка не будет выхода. В реальном коде удалите echo и ожидайте, что exit будет работать.

Edit 2

Кроме того, обратите внимание, что | символ в случае матча (abc_def_data**|**abc_def01_data) является по существу OR (я думаю, что это называется что-то еще в «случае матч» контекста).

IHTH

+0

для каждого «dbname», скрипт попадает в оператор IF и выходы. Мои намерения: когда dbname не равно abc_def_data или abc_def01_data, скрипт должен распечатать этот echo statement & exit ... если dbname равно любому из них обоих, он не должен ВЫХОДИТЬ и перейти к следующему шагу. – MRKR

+0

Да, я прочитал и понял ваш вопрос наверху. Вы пытались заменить блок 'if ... fi' этим блоком' case ... esac'? Он должен работать, как вы описываете. Обратите внимание, что вы можете расширить список OK как «широкий», как хотите, «abc_def_data | abc_def01_data | bcd_def_data | bcd_def01_data | ....». Удачи. – shellter

+0

См. ** edit ** в ответе. Удачи. – shellter

0

попробовать этот человек, он должен работать нормально, вы должны быть отделено условия с «[]» и используется -o вместо || .... кстати он работал для меня хорошо .. .

server=$1 
dbname=$2 
IFS="" 

if [ "${dbname}" != "abc_def_data" ] -o [ "${dbname}" != "abc_def01_data" ] 
     then 
     echo "Msg: Triggers can only be applied to CMS_JAD:abc_def_data/abc_def01_data!" 
     exit 0 
fi 
Смежные вопросы