Получение по запросу нескольких альтернатив от переменной в условии случая

Я хотел бы использовать переменную в качестве условия в случае, если оператор. Что-то подобное:

#!/bin/sh

ALLOWED_SERVICES=tomcat6|james;

case $1 in
    $ALLOWED_SERVICES )
        service $1 restart
    ;;
    * )
    echo "Unsupported argument"
    ;;
esac

Это не работает. Когда сценарий запускается с tomcat6 аргумента в пользу примера, это outpoots "сообщение" аргумента Unsuported. Но когда условие случая является hardcoded, это работает хорошо:

case $1 in
    tomcat6|james )
        service $1 restart
    ;;
    * )
    echo "Unsupported argument"
    ;;
esac

Действительно ли возможно использовать переменные в этом случае?

5
задан 15 July 2013 в 10:01

4 ответа

Проблема состоит в том, что и переменное расширение и расширение шаблона должны быть сделаны прежде, чем соответствовать, и это не работает здесь. Если у Вас есть последняя версия bash доступный, Вы могли бы использовать соответствие regex:

#!/bin/bash

ALLOWED_SERVICES="tomcat6|james"

if [[ $ALLOWED_SERVICES =~ $1 ]]; then
  service $1 restart
else
  echo "Unsupported argument"
fi

Добавляют shopt -s nocasematch перед if для создания соответствия нечувствительным к регистру.

2
ответ дан 23 November 2019 в 09:16

Ваш первый clode блок не работал бы, так как он попытается передать вывод по каналу tomcat6 посредством команды james.

Во всяком случае, case вероятно, не правильный инструмент для этого. Используйте массив и затем проверьте по этому:

#!/bin/bash
declare -a ALLOWED_SERVICES
ALLOWED_SERVICES=(james tomcat6)

for servicename in ${ALLOWED_SERVICES[*]};
do
        if [ "${servicename}" == "${1}" ];
        then
          service $1 restart
          exit
        fi

done

echo $0: Error: service \"$1\" not recognized

Править: также: используйте удар :-)

2
ответ дан 23 November 2019 в 09:16

| это отделяется, несколько альтернатив часть синтаксиса оболочки. У Вас не может быть его, прибывают из строки: строка должна была бы соответствовать, с | символ внутри.

То, что можно сделать, проверить, появляется ли сервисное название как подстрока в списке разрешенных сервисов, окруженных разделителями. Другими словами, проверьте, содержит ли список разрешенных сервисов сервис как подстроку. Поместите разделители вокруг сервисного названия в случае, если это является первым или последнее в списке.

case "$1" in
  *\|*) echo 1>&2 "$0: Invalid service name: $1"; exit 2;;
esac
case "|$ALLOWED_SERVICES|" in
  *"|$1|"*) service "$1" restart;;
  *) echo 1>&2 "$0: Unknown or forbidden service: $1"; exit 2;;
esac
2
ответ дан 23 November 2019 в 09:16

Можно использовать переменные в случае, если условия, но Вы не можете передать альтернативы тот путь. Один способ сделать, что Вы хотите, состоял бы в том, чтобы использовать оценку:

#!/bin/sh

ALLOWED_SERVICES="tomcat6|james";

SERVICE="unknown"
[ -n "$1" ] && SERVICE="$1"

CHECKSRV=$(echo $SERVICE | sed 's/[a-z0-9_]*//i')
[ -n "$CHECKSRV" ] && exit 2


eval "
case \"$SERVICE\" in
    ${ALLOWED_SERVICES} )
        service \"$SERVICE\" restart
    ;;
    * )
    echo \"Unsupported argument\"
    ;;
esac
"

я лично предпочел бы другое решение использования оценки, но, учитывая проверку с фильтром sed, необходимо быть хорошими для движения.

0
ответ дан 23 November 2019 в 09:16

Другие вопросы по тегам:

Похожие вопросы: