Использование getopts в пользовательской функции в оболочке Bourne - PullRequest
4 голосов
/ 09 декабря 2008

Можно ли передать аргументы командной строки в функцию из скрипта bourne, чтобы позволить getopts их обрабатывать.

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

Вот как это написано сейчас, но это не работает:

processArgs()
{
  while getopts j:f: arg
  do
  echo "${arg} -- ${OPTARG}"
     case "${arg}" in
       j)  if [ -z "${filename}" ]; then
           job_number=$OPTARG
           else
              echo "Filename ${filename} already set."
              echo "Job number ${OPTARG} will be ignored.
           fi;;
       f)  if [ -z "${job_number}" ]; then
              filename=$OPTARG
           else
              echo "Job number ${job_number} already set."
              echo "Filename ${OPTARG} will be ignored."
           fi;;
     esac
  done
}

doStuff1
processArgs
doStuff2

Возможно ли определить функцию так, чтобы она могла читать аргументы сценариев? Можно ли это сделать другим способом? Мне нравится функциональность getopts, но, похоже, в этом случае мне придется пожертвовать красотой кода, чтобы получить его.

1 Ответ

6 голосов
/ 09 декабря 2008

Вы можете предоставить аргументы getopts после переменной. По умолчанию это $ @, но это также то, что функции оболочки используют для представления своих аргументов. Решение - передать "$ @" & mdash; представление всех аргументов командной строки скрипта в виде отдельных строк & mdash; обрабатывать Args:

processArgs "$@"

Добавление этого к вашему сценарию (и исправление кавычек в строке 11) и попытка использовать несколько проверочных аргументов:

$ ./try -j asdf -f fooo -fasdfasdf -j424pyagnasd
j -- asdf
f -- fooo
Job number asdf already set.
Filename fooo will be ignored.
f -- asdfasdf
Job number asdf already set.
Filename asdfasdf will be ignored.
j -- 424pyagnasd
...