bash case && extra OPTARG

Проблема здесь в том, что мне пришлось использовать:

sudo a2enmod xxx.load

Затем он сказал перезапустить Apache2. Я сделал это, и теперь все работает.

Эта версия Apache (2.4.12) работает иначе, чем 2.4.7, поэтому мне пришлось сделать все немного по-другому.

4
23.06.2017, 03:53
2 ответа

Традиционное соглашение 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
3
27.01.2020, 20:50

Я бы использовал 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, у вас есть расширенная версия.

4
27.01.2020, 20:50

Теги

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