Argumentos opcionais após ou antes dos argumentos obrigatórios?

6

Estou criando um script de shell e preciso dele para aceitar dois argumentos obrigatórios e um opcional. Como faço para verificar isso? Na maioria dos scripts que vi, os argumentos opcionais são passados antes dos obrigatórios, como:

cut -c2 test.txt

Mas para mim esse padrão seria complicado para verificar o script, então minha ideia é considerar o terceiro argumento como opcional.

    
por Cold 17.10.2014 / 17:07

3 respostas

5

Se você está bem com os argumentos opcionais no final, você pode fazer isso:

foo=$1
bar=$2
baz=${3:-default value}

Isso armazenará os dois primeiros argumentos em $foo e $bar . Se um terceiro argumento foi fornecido, ele será armazenado em $baz ; caso contrário, será padronizado como default value . Você também pode apenas verificar se a terceira variável está vazia:

if [ -z "$3" ]; then
    # Code for the case that the user didn't pass a third argument
fi

Se você quiser os padrões no início, a maneira mais fácil é provavelmente verificar o número de argumentos passados para o script, que é armazenado em $# . Por exemplo:

case $# in
  2)
    # Put commands here for when the user passes two arguments
    # Could just be setting variables like above, or anything else you need
    ;;
  3)
    # Put commands here for when the user passes three arguments
    ;;
  *)
    echo "Wrong number of arguments passed"
    exit 1;;
esac

A ativação de $# funcionará bem em ambos os casos, se você quiser verificar o erro. Se o seu script usa argumentos no estilo getopt como o exemplo cut , você pode usar isso; consulte esta pergunta sobre estouro de pilha para obter mais informações

    
por 17.10.2014 / 17:21
0

Existem dois conceitos diferentes: argumentos obrigatórios x argumentos opcionais e opções versus operandos. Opções são argumentos que começam com - , operandos são argumentos que não começam com - e não são o argumento de uma opção. As opções são identificadas pelo nome e normalmente podem estar em qualquer ordem. Operandos são identificados por sua posição. Então, em

someprogram -a -z -c foo bar

existem três opções -a , -c e -z , e há dois operandos, sendo o primeiro foo e o segundo bar .

As opções normalmente vão antes dos operandos. Os programas GNU tendem a não se preocupar com a ordem, enquanto a maioria dos programas não-GNU trata os argumentos que começam com - como operandos, se houver outro operando antes deles. Existem muitas variações nas opções (agrupamento, -- , etc.) que eu não verei aqui.

Se o seu programa obtiver dois operandos obrigatórios e um terceiro operando opcional, a forma natural é que os operandos obrigatórios sejam o primeiro e o segundo, e o terceiro operando seja o opcional, se presente.

Em um script de shell, os argumentos são "$1" , "$2" , "$3" , etc. O número de argumentos é $# . Se o seu script não reconhecer nenhuma opção, você poderá deixar de fora a detecção de opções e tratar todos os argumentos como operandos. Veja a resposta de Michael Mrozek para o código de exemplo. Se você quiser reconhecer opções, use o getopts builtin (veja a documentação do seu shell para exemplos).

    
por 18.10.2014 / 01:59
0

Um método para colocar o argumento opcional no início é usar shift .
O que ele faz é mover todos os argumentos no número de etapas para a esquerda, removendo os que estão abaixo de $1 . Sem nenhum argumento dado a shift , o número de etapas é 1.

No início do script, você verifica se o primeiro argumento corresponde à estrutura do argumento opcional ou do primeiro argumento obrigatório.
Se é o requerido, você não faz nada.
Se for o opcional, você lida com ele e chama shift .

A coisa útil aqui é que, independentemente de o argumento opcional ser dado ou não, os argumentos requeridos, digamos, há 3, sempre estarão em $1 to $3 após o bloco onde o argumento opcional é tratado.

    
por 15.04.2018 / 03:41