2008-12-09 4 views
4

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

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

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

 
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, но похоже, что в этом случае мне придется пожертвовать красотой кода, чтобы получить его.

ответ

6

Вы можете указать args для getopts после переменной. По умолчанию используется значение $ @, но это также означает, что функции оболочки используют свои аргументы. Решение состоит в передаче «$ @» — представляющий все аргументы командной строки скрипта в виде отдельных строк — в processArgs:

 
processArgs "[email protected]" 

добавив, что в скрипт (и фиксации процитировать в строке 11) и опробовать некоторые gibberish test args:

 
$ ./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 
+5

Я также рекомендую использовать `local OPTIND` внутри функции для предотвращения ошибок, когда optargs вызывается более одного раза из-за вызываемой функции несколько раз. – 2012-01-09 16:28:50