getopts passa o valor do parâmetro declarado para funcionar

1

Eu tenho a função port.sh como script independente e estou querendo saber se é possível colocar essa função no mesmo script em que getopts é e passar valor de OPT_B para a função e obter saída dela?

        OPT_B=B

        while getopts :a FLAG; do
          case $FLAG in
            b)  #set option "b"
             OPT_B=$OPTARG
              ;;
          esac
        done

    shift $((OPTIND-1))

!!-->> port $1 <<--!! -> OPT_B=$(port $1) ??

    function port()
     {
        if  [ "$1" = 'B' ]; then
        set $1=8000
        echo "declared value: $1"

        elif [[ "$1" =~ ^[0-9]+$ ]] && [ "$1" -ge 1 -a "$1" -le 10000 ]; then
        echo "chosen value: $1"
        else echo "chosen value $1 is not in '1 - 10000'"
        fi
    return 0;
    }
    
por ticket 25.02.2015 / 23:01

1 resposta

1

Não use function port() - na verdade, não faz sentido. Ao declarar uma função bash ou ksh com o comando function você não usa o () , mas o shell aceita como uma sintaxe perdoável oops e age como se você não tivesse usado function . Então não faça.

port()
    case ${1:--} in (B) OPT_B=8000;; (*[!0-9]*)
     !   printf 'chosen value %s not in %s\n' \
                "${1:-''}" "'1 - 10000'"      ;;
    (*)  [ "$(( $1>0 && $1<10001 ))" -ne 0 ]  &&
         echo "chosen value '$1'"             ||
         port "'$1'"                          ;;
    esac

Essa é uma maneira POSIXly correta de escrever sua função (exceto que o acima retorna corretamente em caso de erro) . Se o acima estivesse em um script de shell diferente de $0 e eu quisesse chamar essa função de qualquer maneira, provavelmente faria:

eval "$(sed '/^port()/,$!d;/esac/q' /path/to/script_containing_port.sh)" 
port B #or whatever

... se eu pudesse ter certeza de que a primeira ocorrência de ^port() nesse script definitivamente significava o início da função que queria declarar. Senão, se a função estivesse em um script próprio, eu faria:

. /path/to/port.fn.sh; port B

Por fim, você provavelmente não deve nomear seus arquivos de script something.sh a menos que eles realmente sejam sh scripts - o que significa que, se você escrever um nome de script bash , something.bash . Não faz sentido de outra forma.

    
por 26.02.2015 / 05:15