2014-02-13 4 views
0

Я пытаюсь обрабатывать как необязательный, так и обязательный параметр для моего сценария bash. У меня есть следующий сценарий:Сценарий с аргументами опций и опций

while getopts "a:x:" opt; do 
    case $opt in 
    a) echo "option a set: $OPTARG" ;; 
    x) echo "option x set: $OPTARG" ;; 
    \?) echo "Invalid option: -$OPTARG" >&2; exit 1;; 
esac 
done 
shift $((OPTIND-1)) 

echo "mandatory argument $1" 
echo "mandatory argument2 $2" 

Все выглядит нормально, когда я бегу мой сценарий, используя следующую команду:

./script.sh -a optionA -x optionX mandatory1 mandatory2 

Но когда я смешиваю это Params:

./script.sh mandatory1 mandatory2 -a optionA -x optionX 

Это не делает. .. Как заставить его работать для всех комбинаций параметров?

+0

имеет различный порядок означает разные вещи? если нет, я не вижу смысла делать это. –

+0

@ KarolyHorvath означает абсолютно то же самое, поэтому он должен работать точно так же. И это не так. – J33nn

+4

нет ничего плохого. это стандарт unix (de facto?), чтобы начать с флагов ... –

ответ

3

Вы можете перебирать оба аргумента, я думаю.

Я думаю, что это делает то, что вы хотите, и позволяет использовать -- для предотвращения использования следующих аргументов в качестве параметров.

mandatory=() 
while [ $# -gt 0 ] && [ "$1" != "--" ]; do 
    while getopts "a:x:" opt; do 
    case $opt in 
     a) echo "option a set: $OPTARG" ;; 
     x) echo "option x set: $OPTARG" ;; 
     \?) echo "Invalid option: -$OPTARG" >&2; exit 1;; 
    esac 
    done 
    shift $((OPTIND-1)) 

    while [ $# -gt 0 ] && ! [[ "$1" =~ ^- ]]; do 
    mandatory=("${mandatory[@]}" "$1") 
    shift 
    done 
done 

if [ "$1" == "--" ]; then 
    shift 
    mandatory=("${mandatory[@]}" "[email protected]") 
fi 

echo "mandatory argument ${mandatory[0]}" 
echo "mandatory argument2 ${mandatory[1]}" 

В принципе, идея заключается в том, чтобы потреблять все варианты с Getopt, а затем потреблять все не-опции вручную, а затем искать больше вариантов с Getopt снова.

+0

Ницца, но было бы даже лучше, если бы вы обработали «-» как разделитель «options end here». –

+0

@GordonDavisson done :-) (но все еще непроверено) – ams

+0

Я протестировал его сейчас и исправил ошибки. – ams

0

Чтобы сделать его работу я должна была снята с OPTIND после shift $((OPTIND-1)):

[...] 
shift $((OPTIND-1)) 
unset OPTIND 
[...]