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.