obtém o primeiro argumento CLI após as opções no shell scipt

1

Eu tenho um script que classifico como gitploy up -t 2.0.0 test_repo . Eu pego a "ação" up imediatamente, então eu preciso ser capaz de obter o test_repo antes de processar as opções. Eu não quero perder os argumentos na linha, se isso faz sentido ... não quero mudar isso, apenas pegue e deixe ser? Basicamente eu quero pegar esse test_repo spot antes de fazer

while getopts "zhvdurqw:c:i:e:o:b:t:f:p:g" opt; do
  case $opt in

    #flag----------------------
    h)
      usage;
      exit 0
      ;;
    #callback------------------
    c) queue_callback "$OPTARG"
      shift $((OPTIND-1)); OPTIND=1
      ;;
### so one and so forth

seção do script. Então basicamente eu posso fazer algo assim

# i would get the first argument after the options here first so "test_repo" 
# would be a $@ or $* or something?
root_arg="test_repo"

while getopts "zhvdurqw:c:i:e:o:b:t:f:p:g" opt; do
  case $opt in

    #flag----------------------
    h)
      usage;
      exit 0
      ;;
    #callback------------------
    c) queue_callback "$OPTARG"
      echo "$root_arg was here"
      shift $((OPTIND-1)); OPTIND=1
      ;;
### so one and so forth

Em um escopo mais amplo disso, talvez a questão seja a seguinte, "Como obter um argumento por posição em relação às opções?"

revisão da questão:

A esperança é dizer algo como

  • positon de getopts output no comando em var
  • chame a posição da saída de getopts +1
    • O argumento test_repo está localizado em +1 após a saída de getopts
  • processa normal

Estou tentando não mover o comando por motivos de compatibilidade com versões anteriores para começar, mas não estou realmente limitado a isso. Eu imaginei que poderia escrever um pequeno shim aqui, pois sei que o padrão já está definido para gitploy <__action> [__options] <__alias> [__remote_url] .

Eu acho que eu poderia fazer tudo uma opção e depreciar os outros argumentos. Não tenho certeza se é uma maneira ruim de fazer isso, mas parece que eu teria que digitalizar em uma ordem para procurar o <__alias> (ou o test_repo como apresentado no exemplo) e procurá-lo como uma opção como como -a test_repo .

Mesmo que não seja o jeito certo de fazer isso no final, eu gostaria de ter uma resposta se você puder "ler o cursor" aqui e determinar o valor do argumento ou se é uma coisa impossível de fazer.

resultado da resposta abaixo

while getopts "zhvdurqw:c:i:e:o:b:t:f:p:g" opt; do
    case "$opt" in
    esac
done

index="$((OPTIND))"
GD_REPO="${!index}";
OPTIND=1

Isso foi o que acabei fazendo. Parece um truque sujo para avançar e retroceder, mas funciona. Se houver ideias melhores, ainda adoraria aprendê-las.

    
por jeremy.bass 22.01.2016 / 19:00

1 resposta

1

Seus requisitos são logicamente contraditórios. Dada a entrada como gitploy up -t 2.0.0 test_repo , é necessário analisar as opções e, em especial, observar a presença da opção -t e o fato de que é necessário um argumento para identificar que o primeiro argumento não-opcional é test_repo .

Então, primeiro analisar as opções normalmente. Então você pode saber qual é o primeiro operando. Nesse momento, processe as opções. Armazene as informações necessárias sobre as opções nas variáveis.

action="$1"
shift
unset t_arg
while getopts "zhvdurqw:c:i:e:o:b:t:f:p:g" opt; do
  case "$opt" in
    c) c_arg="$OPTARG";;
    …
  esac
done
shift "$((OPTIND-1))"
root_arg="$1"

if [ -n "${c_arg+1}" ]; then
  queue_callback "$OPTARG"
  echo "$root_arg was here"
fi
    
por 25.01.2016 / 00:24