Я хотел бы использовать переменную в качестве условия в случае, если оператор. Что-то подобное:
#!/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
Действительно ли возможно использовать переменные в этом случае?
Проблема состоит в том, что и переменное расширение и расширение шаблона должны быть сделаны прежде, чем соответствовать, и это не работает здесь. Если у Вас есть последняя версия 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
для создания соответствия нечувствительным к регистру.
Ваш первый 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
Править: также: используйте удар :-)
|
это отделяется, несколько альтернатив часть синтаксиса оболочки. У Вас не может быть его, прибывают из строки: строка должна была бы соответствовать, с |
символ внутри.
То, что можно сделать, проверить, появляется ли сервисное название как подстрока в списке разрешенных сервисов, окруженных разделителями. Другими словами, проверьте, содержит ли список разрешенных сервисов сервис как подстроку. Поместите разделители вокруг сервисного названия в случае, если это является первым или последнее в списке.
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
Можно использовать переменные в случае, если условия, но Вы не можете передать альтернативы тот путь. Один способ сделать, что Вы хотите, состоял бы в том, чтобы использовать оценку:
#!/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, необходимо быть хорошими для движения.