Múltiplos parâmetros para o script bash

3

Eu preciso verificar as opções fornecidas pelo usuário no meu script bash, mas as opções nem sempre serão fornecidas durante a chamada do script. Por exemplo, as opções possíveis podem ser -dontbuild -donttest -dontupdate em qualquer combinação, existe uma maneira que eu poderia verificar para eles? Desculpe se esta questão é básica, eu sou novo no bash scripting.

Obrigado

EDITAR: Eu tentei este pedaço de código, e chamei o script com a opção, -disableVenusBld, mas ainda imprime "Starting build". Estou fazendo algo errado? Obrigado antecipadamente!

while [ $# -ne 0 ]
do
    arg="$1"
    case "$arg" in
        -disableVenusBld)
            disableVenusBld=true
            ;;
        -disableCopperBld)
            disableCopperBld=true
            ;;
        -disableTest)
            disableTest=true
            ;;
        -disableUpdate)
            disableUpdate=true
            ;;
        *)
            nothing="true"
            ;;
    esac
    shift
done

if [ "$disableVenusBld" != true ]; then
    echo "Starting build"
fi
    
por iman453 08.09.2010 / 20:56

2 respostas

3

Dennis teve a idéia certa, eu gostaria de sugerir alguns pequenos mods.

Argumentos para shell scripts são acessados por parâmetros posicionais $ 1, $ 2, $ 3, etc ... e a contagem atual vem em $ #. A verificação clássica para isso seria:

while [ $# -ne 0 ]
do
    ARG="$1"
    shift # get rid of $1, we saved in ARG already
    case "$ARG" in
    -dontbuild)
        DONTBUILD=1
        ;;
    -somethingwithaparam)
        SAVESOMEPARAM="$1"
        shift
        ;;
# ... continue
done

Como diz Dennis, se seus requisitos se encaixam em getopts, é melhor você usar isso.

    
por 08.09.2010 / 22:51
5
for arg
do
    case "$arg" in
        -dontbuild)
            do_something
            ;;
        -donttest)
            do_something
            ;;
        -dontupdate)
            do_something
            ;;
        *)
            echo "Unknown argument"
            exit 1
            ;;
     esac
done

Em que do_something representa a configuração de um sinalizador ou a realização de alguma ação. Observe que for arg implicitamente faz a iteração sobre $@ (a matriz de parâmetros posicionais) e é equivalente ao for arg in $@ explícito.

Note também que o Bash tem um builtin chamado getopts , mas só tem opções curtas (por exemplo, -x ). Há também um utilitário externo chamado getopt , que tem opções longas, mas tem várias falhas e não é recomendado.

options=":es:w:d:"

OLDOPTIND=$OPTIND
while getopts $options option
do
  case $option in
    e     ) do_something;;
    w     ) do_something $OPTARG;;
    d     ) foo=$OPTARG;;
    q     ) do_something;;
    s ) case $OPTARG in
                m | M ) bar="abc";;
                s | S ) baz="def";;
                *     ) echo "Invalid option for blah blah" 1>&2; exit;;
        esac;;
    *     ) echo "Unimplemented option chosen.";;   # DEFAULT
  esac
OLDOPTIND=$OPTIND
done
    
por 08.09.2010 / 20:59