analisar opções condensadas para bash

1

Eu tenho algo assim:

while [[ $# > 0 ]] ; do
    key="$1"
    count=0
    echo "$1"
    case "$key" in
        -r|--rotate)
            shift
            rotate $1
            shift
            ;;
        -d|--devices)       
            shift
            while [[ "$1" != "-"* && "$1" != "" ]] ; do
                disps["$count"]="$1"
                ((count++))
                shift
            done
            calibrate disps[@]
            ;;
        -h|--help)
            shift
            usage
            ;;
        *)
            shift
            usage
            ;;
    esac
done

Eu quero fazer estados de rotação nas opções, pois elas são apenas normais, direita esquerda e invertida.

Eu sei que preciso criar um caso para cada um deles -n -r -l -i mas ... Eu precisarei criar um caso para cada combinação também? -d | -dn, -rd | -dr ... Existe uma maneira mais simples ou educada?

Obrigado.

    
por RomuloPBenedetti 23.07.2015 / 15:11

1 resposta

1

use getopt para ativar as opções longas e curtas, bem como a concatenação da opção -rdn

parsed_options=$( getopt -o r:d:h --long rotate:,device:,help --name "$(basename -- "$0")" -- "$@" )
# option name followed by a single colon indicates the option takes
# a required argument

if [ $! -ne 0 ]; then
    echo "Exiting" >&2
    exit 1
fi

eval set -- "$parsed_options"

disps=()

while :; do
    case "$1" in
        -r|--rotate)
            rotate "$2"
            shift 2
            ;;
        -d|--device)       
            disps+=("$2")   # append the arg to the disps array
            shift 2
            ;;
        -h|--help) usage; exit ;;
        --) shift; break ;;
        *) echo "Internal error" >&2; exit 1 ;;
    esac
done

if (( ${#disps[@]} == 0 )); then
    echo "no devices to calibrate"
else
    calibrate "${disps[@]}"
fi

Uma opção só pode receber zero ou um argumento. Para especificar muitos dispositivos, use a opção -d arg muitas vezes.

    
por 23.07.2015 / 16:38