como analisar corretamente os sinalizadores e argumentos do shell script usando getopts

Estou usando:

por exemplo ./imgSorter.sh -d directory -f format

o conteúdo dos scripts” é:

#!/bin/bash while getopts ":d:f:" opt; do case $opt in d) echo "-d was triggered with $OPTARG" >&2 ;; f) echo "-f was triggered with $OPTARG" >&2 ;; \?) echo "Invalid option: -$OPTARG" >&2 exit 1 ;; :) echo "Option -$OPTARG requires an argument." >&2 exit 1 ;; esac done 

casos de uso:

$ ./imgSorter.sh -d myDir -d was triggered with myDir OK

$ ./imgSorter.sh -d -f myFormat -d was triggered with -f NOK: como é que uma string começando com – não é detectada como um sinalizador?

Resposta

Você disse a getopts que -d deve ter um argumento, e na linha de comando você usa -d -f myformat que claramente (?) diz “-f é o argumento que estou dando para a -d opção “.

Este não é um erro no código, mas no uso do script na linha de comando.

Seu código precisa verificar se os argumentos das opções estão corretos e se todas as opções estão definidas de maneira apropriada.

Possivelmente algo como

while getopts "d:f:" opt; do case $opt in d) dir=$OPTARG ;; f) format=$OPTARG ;; *) echo "error" >&2 exit 1 esac done # If -d is *required* if [ ! -d "$dir" ]; then echo "Option -d missing or designates non-directory" >&2 exit 1 fi # If -d is *optional* if [ -n "$dir" ] && [ ! -d "$dir" ]; then echo "Option -d designates non-directory" >&2 exit 1 fi 

Se a opção -d for opcional, e se você quiser usar um valor padrão para a variável dir no código acima, você começaria definindo dir com o valor padrão antes de while loop.

Uma opção de linha de comando não pode aceitar e não aceitar um argumento.

Comentários

  • ok, obrigado @Kusalananda, eu presumi erroneamente que getopts levava tudo – para o início de uma bandeira.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *