Bash: getopts передает флаг как неверный аргумент - PullRequest
0 голосов
/ 01 ноября 2011

Я пытаюсь запустить команду с несколькими аргументами.Синтаксис команды выглядит так:

./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

applications=$@

Ответы [ 2 ]

2 голосов
/ 01 ноября 2011

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

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

0 голосов
/ 01 ноября 2011

Вы можете определить его, используя getopt, чтобы сделать что-то вроде:

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