Подтвердить что ты не робот

Bash строка сравнивается с несколькими правильными значениями

у меня есть следующий кусок bashscript:

function get_cms {
    echo "input cms name"
    read cms
    cms=${cms,,}
    if [ "$cms" != "wordpress" && "$cms" != "meganto" && "$cms" != "typo3" ]; then
        get_cms
    fi
}

Но независимо от того, что я ввожу (правильные и неправильные значения), он никогда больше не вызывает функцию, потому что я хочу разрешить только один из этих трех входов. Я попробовал это с || с [ var != value ] or [ var != value1 ] or [ var != value1 ] но ничего не работает. Может ли кто-нибудь указать мне правильное направление?

4b9b3361

Ответ 1

Вместо того, чтобы говорить:

if [ "$cms" != "wordpress" && "$cms" != "meganto" && "$cms" != "typo3" ]; then

говорят:

if [[ "$cms" != "wordpress" && "$cms" != "meganto" && "$cms" != "typo3" ]]; then

Вы также можете обратиться к Условные конструкции.

Ответ 2

Если основное намерение состоит в том, чтобы проверить, не указано ли входящее значение в списке, возможно, вы можете использовать расширенное соответствие регулярных выражений, встроенное в BASH, с помощью оператора "equal tilde" (см. также этот ответ):

if ! [[ "$cms" =~ ^(wordpress|meganto|typo3)$ ]]; then get_cms ; fi

Хороший день

Ответ 3

Возможно, вам лучше использовать case для таких списков:

case "$cms" in
  wordpress|meganto|typo3)
    do_your_else_case
    ;;
  *)
    do_your_then_case
    ;;
esac

Я думаю, что надолго такие списки лучше читаемы.

Если вы все еще предпочитаете if, вы можете сделать это с помощью отдельных скобок двумя способами:

if [ "$cms" != wordpress -a "$cms" != meganto -a "$cms" != typo3 ]; then

или

if [ "$cms" != wordpress ] && [ "$cms" != meganto ] && [ "$cms" != typo3 ]; then

Ответ 4

Здесь мое решение

if [[ "${cms}" != +(wordpress|magento|typo3) ]]; then