Qual é a maneira canônica de implementar opções independentes de ordem em scripts bash? [duplicado]

1

Os comandos shell mais comuns permitem ao usuário especificar opções em qualquer ordem aleatória. Parâmetros posicionais como $1 como comumente usados no bash (eu costumo escrever todos os meus scripts no Bash, mas eu não acho que essa pergunta é realmente Bash específica) scripts, por outro lado, são específicos da ordem.

Agora eu poderia criar alguma maneira de remover a necessidade de o usuário de um script bash observar qualquer ordem específica no fornecimento de argumentos opcionais. (Usar expressões regulares ou globs para testar a presença de alguma opção em particular na expansão $@ vem à mente.) No entanto, estou realmente tentando descobrir se existe uma maneira particularmente canônica de implementar essas opções. Dada a sintaxe comum de opções como -r para muitos comandos de shell, certamente sinto que deveria existir.

    
por Psachnodaimonia 25.09.2012 / 16:29

1 resposta

3

getopt e getopts suportam qualquer ordem para os argumentos fornecidos - Eles são fáceis de usar e parecem ser as soluções canônicas para a análise de argumentos.

Duas diferenças que são frequentemente mencionadas:

  • getopt suporta opções longas como --help .
  • getopts é um shell Bash embutido em vez de um programa independente.

Exemplo exemplo :

simplificado e abrangente
# Process parameters
params="$(getopt -o e:hv \
    -l exclude:,help,verbose \
    --name "$0" -- "$@")"

if [ $? -ne 0 ]
then
    usage
fi

eval set -- "$params"
unset params

while true
do
    case $1 in
        -e|--exclude)
            excludes+=("${2-}")
            shift 2
            ;;
        -h|--help)
            usage
            exit
            ;;
        -v|--verbose)
            verbose='--verbose'
            shift
            ;;
        --)
            shift
            if [ -z "${1:-}" ]
            then
                error "Missing targets." "$help_info" $EX_USAGE
            fi
            if [ -z "${2:-}" ]
            then
                error "Missing directory." "$help_info" $EX_USAGE
            fi
            targets=(${@:1:$(($#-1))})
            source_dir="${@:$#}"
            break
            ;;
        *)
            usage
            ;;
    esac
done
    
por 25.09.2012 / 17:17