2011-10-31 5 views
0

Я пытаюсь запустить команду с несколькими аргументами. Синтаксис команды следующим образом:Bash: getopts передает флаг как неправильный аргумент

./foo -d directory -f file -v version app1 app2 app3 (this situation works) 

Однако, если я поставил -v version после app1,2,3 оно передается в качестве аргумента, а не -v флага. Как получить флаг -v для работы в любой позиции с несколькими аргументами?

while getopts ":d:f:v:" OPTION 

do 
    case $OPTION in 


      d) IFS=","; directory=$OPTARG;; 
      f) file=$OPTARG;; 
      v) version=$OPTARG;; 
      *) echo && usage;; 
      /?) echo && usage;; 
    esac 
done 
shift $((OPTIND - 1)) 

for dir in ${dirList} do 
for f in ${file} ; do 
    echo $dir/$file 
done 
done 

[email protected] 
+1

'getopts' перестает разбор на первое без аргумента опции (пропуск опции арг). –

ответ

2

Стандартная обработка опции в Unix останавливается на первый не-варианте (без учета аргументов для опций, отмеченных :). Это несколько важно, потому что иначе вы не могли бы обрабатывать файлы или каталоги, начиная с -.

Если вы действительно нарушите эти правила, вы можете попробовать внешнюю программу getopt(1), которая использует библиотечную функцию getopt(3). Чтение страницы руководства для этой функции есть несколько замечаний относительно перетасовки аргументов. Они могут вам помочь.

+0

Спасибо, дайте другому getopt (1,3) попробовать – vegasbrianc

0

Вы можете определить его с помощью Getopt так, что вы делаете что-то вроде:

./foo -d directory -f file -v version -v app1 -v app2 -v app3 
+0

Это не сработает для моего приложения, к сожалению. Сценарий должен передавать аргументы без флагов. – vegasbrianc

Смежные вопросы