BASH pega mais argumentos após a opção [duplicate]

2

Como posso fazer o getopts aceitar 2 argumentos depois da opção -h? Quer dizer, é suposto ser salvo em array, mas ou ele não funciona, ou estou cometendo erro ao escrevê-lo assim: echo "$ {array [1]} $ {array [2]}"

 OPTIND=1 
    hh=
    while getopts "h:" flag
    do
    case "$flag" in
    h)
    hh=($OPTARG)  ;;
   esac
   done
   shift "$((OPTIND-1))"
    
por anonym 19.03.2015 / 22:35

3 respostas

3

Isso não é possível. O que você pode fazer é passar os dois argumentos citados e separados por um delimitador apropriado e dividir OPTARG para obter as duas partes.

Exemplos de sintaxes de chamadas possíveis são:

prog -h part1:part2

prog -h "part1 part2"

E na sua declaração case , você pode dividir os componentes, por exemplo. no caso de um delimitador de cólon:

p1=${OPTARG%:*} p2=${OPTARG#*:}

Editar (para esclarecer): Um "delimitador apropriado" é aquele que não faz parte dos componentes individuais part1 / part2 (portanto, único no composto OPTARG ), de modo que a divisão não seja ambígua. / p>     

por 19.03.2015 / 22:37
2

Uma maneira de fazer isso seria passar -h várias vezes:

OPTIND=1 
hh=()
while getopts h: flag; do
  case "$flag" in
    h) hh+=("$OPTARG");;
  esac
done
shift "$((OPTIND-1))"

E chame como:

myscript -h host1 -h host2...
    
por 19.03.2015 / 23:18
0

Resposta curta: getopts não se destina a ser usado assim.

Resposta longa: você pode tentar algo assim (não testado), mas getopts não poderá fazer a verificação de sintaxe:

OPTIND=1 
hh=()
args=( "$@" )
while getopts "h:" flag; do
  case "$flag" in
  h)
    hh=("$OPTARG" "${args[$OPTIND]}")
    $((OPTIND++))
    ;;
  esac
done
shift "$((OPTIND-1))"

Se você seguir esse caminho, precisará adicionar seu próprio tratamento de erros para, por exemplo, o segundo argumento não existe / está vazio / parece uma opção em vez de um argumento.

    
por 20.03.2015 / 01:46

Tags