Проблема здесь в том, что мне пришлось использовать:
sudo a2enmod xxx.load
Затем он сказал перезапустить Apache2. Я сделал это, и теперь все работает.
Эта версия Apache (2.4.12) работает иначе, чем 2.4.7, поэтому мне пришлось сделать все немного по-другому.
Традиционное соглашение Unix заключается в том, что в командной строке есть параметры (включая аргументы параметров), затемне являющиеся параметрами аргументы команды. В mwctl -D -a weblogic -c start admin -e trn -r
параметры: -D
(без аргумента), -a
(аргумент: weblogic
) и -c
(аргумент: start
). Следующее слово — admin
, что не является вариантом, поэтому варианты исчерпаны. Таким образом, необязательными аргументами являются admin
, -e
, trn
и -r
. Встроенная команда getopt
реализует это соглашение.
Согласно соглашению GNU, аргумент, начинающийся с -
в любом месте командной строки , является опцией, если перед ней нет аргумента --
, с предупредите, что аргументы опций не учитываются.Согласно соглашению GNU, в mwctl -D -a weblogic -c start admin -e trn -r
есть опция -D
, опция -a
с аргументом weblogic
, опция -c
с аргументом start
, аргумент без опции admin
, опция -e
с аргументом trn
и опцией -r
.
case
не «сходит с ума», ваша проблема не имеет отношения к case
. В вашем коде отсутствует извлечение аргументов, не являющихся параметрами:
case $arg in …
esac
shift $((OPTIND - 1))
echo "There are $# non-option arguments, the first is $1"
Если команда не поддерживает аргументы, не являющиеся параметрами, вам необходимо указать это явно.
…
shift $((OPTIND - 1))
if [ $# -ne 0 ]; then
echo >&2 "Extraneous argument: $1"
exit 3
fi
Я бы использовал getopt
вместоgetopts
:
#!/usr/bin/env bash
OPT=$(getopt \
--options a:c:d:De:rs: \
--name "$0" \
-- "$@"
)
if [ $? -ne 0 ]; then
echo You are doing it wrong!
exit 1
fi
eval set -- "${OPT}"
while true; do
case "$1" in
-a) app=${2}; shift 2;;
-c) cmd=${2}; shift 2;;
-d) domain=${2}; shift 2;;
-D) Debug=1; shift;;
-e) env=${2}; shift 2;;
-r) Doit=1; shift;;
-s) subapp=${2}; shift 2;;
--) break;;
esac
done
echo "Env: ${env}"
echo "App: ${app}"
echo "Subapp: ${subapp}"
echo "Cmd: ${cmd}"
echo "Doit: ${Doit}"
echo "Debug: ${Debug}"
$./mwctl -a weblogic -c start -s admin -e trn -r -D
> Env: trn
> App: weblogic
> Subapp: admin
> Cmd: start
> Doit: 1
> Debug: 1
$./mwctl -D -a weblogic -c start admin -e trn -r
> Env: trn
> App: weblogic
> Subapp:
> Cmd: start
> Doit: 1
> Debug: 1
Обратите внимание, что когда вы гуглите getopts
по сравнению с getopt
, вы обнаружите, что многие люди жалуются на getopt
. Насколько я могу судить, речь всегда идет о более старой версии getopt
, которая действительно содержала много ошибок. По моему опыту, getopt
имеет больше возможностей, а также более надежен, чем getopts
.
Чтобы проверить, установлена ли у вас расширенная версия getopt
, вы можете запустить
getopt -T
echo $?
Если на выходе 4
, у вас есть расширенная версия.