2017-02-03 3 views
0

Попытка сравнения с переменной против строк, я попытался код, согласно решению от https://unix.stackexchange.com/questions/67898/using-the-not-equal-operator-for-string-comparisonBash, если оператор с оператором И

if [ "$ACTION" != "dry" ] && [ "$ACTION" != "prune" ] 
then 
    echo "Invalid" 
fi 

Это не работает для меня, я не получаю сообщения об ошибках, это как это просто пропускает блок кода.

Я также пробовал так, как в ответ здесь Bash if statement with multiple conditions

if [[ "$ACTION" != "dry" && "$ACTION" != "prune" ]] 
then 
    echo "Invalid" 
fi 

Это перекликается «Invalid», если $ ACTION ничего, кроме «сухой», даже если его «подрезать»

Все предложения ?


EDIT

Полный код

OPTIND=1 
while getopts "b:a:" option 
do 
    case "${option}" 
    in 
     b) MERGE_BRANCH=${OPTARG};; 
     a) ACTION=${OPTARG};; 
    esac 
done 

if [[ "$ACTION" != "dry" && "$ACTION" != "prune" ]] 
then 
    echo "Invalid" 
fi 

shift $((OPTIND-1)) 
[ "$1" = "--" ] && shift 

((1 <= ${#})) || { echo "missing mandatory argument" 2>&1 ; exit 1;  }; 
+1

Как устанавливается 'ACTION'? Каков результат 'declare -p ACTION'? Я подозреваю, что значение имеет завершающий пробел (в частности, возврат каретки). – chepner

+0

@chepner объявляя действие выводит правильно 'объявить - ACTION = "чернослив"' Это устанавливается с помощью getopts, как это 'в то время как getopts "б: а:" вариант сделать случай "$ {опция}" в б) MERGE_BRANCH = $ {OPTARG} ;; a) ACTION = $ {OPTARG} ;; esac done' –

+0

Это отгоняет «Недействительно», если $ ACTION - это что-то другое, кроме «сухого», даже если его «чернослив» → не для меня: он не печатает «Invalid», если «ACTION» равно «prune». – rom1v

ответ

2

Ну, в большинстве ситуаций, когда возникает такая команда, с помощью case обеспечивает более ремонтопригодны решение, потому что в течение жизненного цикла вашего сценария вы захотите изменить имена действий, справиться с новыми ситуациями и так далее:

case "$ACTION" in 
    ("dry"|"prune") 
    : # Insert appropriate code 
    ;; 
    (*) 
    echo Invalid 
    ;; 
esac 

Во-вторых, нет необходимости использовать синтаксис [[ в этом случае

if [ "$ACTION" != dry ] && [ "$ACTION" != prune ]; then 
    echo Invalid 
fi 

достаточно в этом случае. Для того, чтобы проверить, что все работает, как ожидалось, можно добавить else ветвь:

if [ "$ACTION" != dry ] && [ "$ACTION" != prune ]; then 
    echo Invalid 
else 
    echo Valid 
fi 
+0

'-a' устарел и не должен использоваться в новом коде. Вместо этого используйте '[...] && [...]'. – chepner

+0

'! =' Не выполняет регулярное выражение; он выполняет сопоставление с образцом *, если * RHS содержит некотируемый шаблон. – chepner

+0

Я получил его для работы с использованием 'case' и перемещения проверки после операции' shift'.Это, похоже, работает по назначению, обновляя OP с помощью решения –

0

Решение

Пользуясь случаем согласно @ ответ Дарио и перемещение чек после операции сдвига делает код работу как предполагалось.

OPTIND=1 

while getopts "b:a:" option 
do 
    case "${option}" 
    in 
     b) MERGE_BRANCH=${OPTARG};; 
     a) ACTION=${OPTARG};; 
    esac 
done 

shift $((OPTIND-1)) 
[ "$1" = "--" ] && shift 

((1 <= ${#})) || { echo "missing mandatory argument" 2>&1 ; exit 1; }; 

case "$ACTION" in 
    (dry|prune) 
    : 
    ;; 
    (*) 
    echo "Invalid argument" 
    exit 1 
    ;; 
esac 
+0

Я рад, что ваш код работает сейчас, но я действительно не понимаю, как это имело какой-то значительный эффект. – chepner

Смежные вопросы