2009-05-06 2 views
11

Мне нужно написать Баш скрипт с, и хотел бы, чтобы разобрать неупорядоченные параметры формата:Баш скрипт параметры

scriptname --param1 <string> --param2 <string> --param3 <date> 

Есть простой способ сделать это, или я очень много застрял с $ 1, $ 2, $ 3?

ответ

10

Вы хотите getopts.

+5

getopts не поддерживает длинные переключатели (начиная с -). getopt делает, но довольно ужасно использовать/читать – Cameron

+0

Хорошая точка - если длинные переключатели являются обязательными, getopts - это не правильный инструмент. –

+2

Этот ответ был бы лучше с содержанием и/или примером, а не просто ссылкой. –

1

У Bash есть функция getops, как уже упоминалось ранее, что может решить ваши проблемы.

Если вам нужно что-то более сложное, bash также поддерживает позиционные параметры (упорядоченные $ 1 ... $ 9, а затем $ {10} .... $ {n}), вам придется придумать свои собственные логики для обработки этого ввода. Один простой способ - поставить переключатель/регистр внутри цикла for, итерации по параметрам. Вы можете использовать либо один из двух специальных басов bash, которые обрабатывают вход: $* or [email protected].

8
while [[ $1 = -* ]]; do 
    arg=$1; shift   # shift the found arg away. 

    case $arg in 
     --foo) 
      do_foo "$1" 
      shift   # foo takes an arg, needs an extra shift 
      ;; 
     --bar) 
      do_bar   # bar takes no arg, doesn't need an extra shift 
      ;; 
    esac 
done 
+0

Не следует do_foo «$ 2» be do_foo «$ 1»? – xx77aBs

+0

@ xx77aBs да, он должен! – lhunath

0
#!/bin/bash 

# Parse the command-line arguments 
while [ "$#" -gt "0" ]; do 
    case "$1" in 
    -p1|--param1) 
     PARAM1="$2" 
     shift 2 
    ;; 
    -p2|--param2) 
     PARAM2="$2" 
     shift 2 
    ;; 
    -p3|--param3) 
     PARAM3="$2" 
     shift 2 
    ;; 
    -*|--*) 
     # Unknown option found 
     echo "Unknown option $1." 

     exit 1 
    ;; 
    *) 
     CMD="$1" 
     break 
    ;; 
    esac 
done 


echo "param1: $PARAM1, param2: $PARAM2, param3: $PARAM3, cmd: $CMD" 

Когда я выполняю это:

./<my-script> --param2 my-param-2 --param1 myparam1 --param3 param-3 my-command 

выводит что вы ожидаете:

param1: myparam1, param2: my-param-2, param3: param-3, cmd: my-command