como passar uma mistura de argumentos para um script e apenas um argumento opcional

2

Venho explorando esse problema há mais tempo do que deveria e encontrando o getopts uma ferramenta muito confusa.

Tudo o que quero fazer é o seguinte. Tenho um script que eu posso passar argumentos como este $ 1 $ 2 $ 3 e um deles sendo um e-mail opcional

Então foi isso que eu fiz, o que obviamente não funciona:

#!/bin/bash

    if [[ $# -lt 2 ]] || [[ $# -gt 3 ]]
    then
            echo
            echo "usage is 'basename $0' argument1 argument2 {-e email}"
    exit 1
    fi

    while getopts e: flag; do
      case $flag in
        e)
          EMAIL=$OPTARG;
          ;;
        ?)
          exit;
          ;;
      esac
    done

    [[ -v $EMAIL ]] && echo "I am sending you $1 and $2!!" | mutt -s "present" $EMAIL && exit 0

    echo "I am keeping $1 and $2 to myself"

Claro que eu poderia simplesmente ignorar esse negócio de getopts e fazer sem ele, estou apenas tentando aprender como usá-lo corretamente

    
por Ulukai 27.03.2016 / 13:02

1 resposta

1

Você tem vários problemas:

  • Você está testando o número de argumentos antes que as opções tenham sido processadas. Antes que as opções sejam processadas, você não sabe quantos slots em argv estão ocupados por opções, então você não pode decidir se $# precisa estar entre 2 e 3 (como você propõe), ou qualquer outra coisa. Mesmo se você prever a presença de uma opção -e , não saberá se ela virá como -eemail (consome 1 argv slot) ou -e email (consome 2 slots). Parece que você quer receber exatamente 2 argumentos não opcionais, então o que você precisa fazer é verificar se $# é exatamente igual a 2 depois que as opções foram consumidas.
  • [[ -v $EMAIL ]] email não faz nenhum sentido. Isso testa se o valor de $EMAIL designa uma variável de shell válida, o que não é o que você deseja. Você quis dizer algo como [ -n "$EMAIL" ]
  • getopts não consome as opções, apenas as analisa. Depois de analisá-los, você deve passar por eles com shift $(($OPTIND-1)) .
  • Você está invocando o script incorretamente. As opções vêm antes dos argumentos, então o uso é $0 [-e email] argument1 argument2 .
por 27.03.2016 / 14:33