O getopts
incorporado analisa as opções. Você o executa apenas uma vez para todas as opções e, em seguida, processa os operandos (argumentos não opcionais) que restam. getopts
permite ao chamador escrever com indiferença, por ex. moveToBin -iv file1
ou moveToBin -i -v file1
, e você pode escrever moveToBin -- -file
para manipular nomes de arquivos que começam com um traço (qualquer coisa depois que --
for interpretado como um operando).
getopts
registra quantos argumentos já foram processados por meio da variável OPTIND
. Quando terminar seu trabalho, OPTIND
é o índice do primeiro operando; como os argumentos são numerados de 1, isso significa que os primeiros OPTIND-1
argumentos eram opções.
Desde que você esteja analisando as opções, ainda não sabe a lista de arquivos a serem processados. Então lembre-se da opção definindo uma variável e consulte a variável mais tarde.
#!/bin/bash
confirm=
verbose=
while getopts 'iv' OPTLET; do
case $OPTLET in
i) confirm=y;;
v) verbose=y;;
\?) exit 3;; # Invalid option; getopts already printed an error message
esac
done
shift $((OPTIND-1))
for file in "$@"; do
if [[ -n $confirm ]]; then
read -p "want to delete $param ?" ans
if [[ $ans != [Yy]* ]]; then
continue # the user said no, so skip this file
fi
fi
… # do that moving stuff
if [[ -n $verbose ]]; then
echo "File $file deleted"
fi
done
Observe que getopts
segue o modelo de análise de opção tradicional, em que qualquer coisa após o primeiro operando é uma não opção. Em outras palavras, em moveToBin -i foo -v bar
, há a opção -i
e, em seguida, três arquivos foo
, -v
e bar
. Se você quiser permitir o modelo de análise de opções GNU, onde as opções podem ser misturadas com operandos, getopts
não é particularmente útil. Nem o getopts
do bash pode analisar as opções longas do GNU ( --verbose
seria analisado como -v -e -r -b -o -s -e
mais um erro sobre -
não suportado).