[ "$OPTARG" -eq "$OPTARG" ] ...
não é o caminho certo para verificar se $OPTARG
é numérico - pode imprimir um erro desagradável desagradável ao usuário, se não for o caso, ou pode simplesmente retornar true em todos os casos (em ksh
), ou também retorna true para um $OPTARG
vazio (em zsh
).
Além disso, uma opção que aceita um argumento pode ser dada como -d12
ou -d 12
, portanto, um cego shift 2
não o cortará. E fazer um shift
dentro do loop pode incorretamente interratar com getopts
, que está usando a lista de argumentos ativos.
Levando isso em conta, é isso que proponho:
die(){ echo >&2 "$@"; exit 1; }
usage(){ echo >&2 "usage: $0 [-h] [-d num] files..."; exit 0; }
depth=0
while getopts :hd: opt; do
case $opt in
h) usage ;;
d) case $OPTARG in
''|*[!-0-9]*|-|*?-*) die "invalid number $OPTARG" ;;
*) depth=$OPTARG ;;
esac
;;
:) die "argument needed to -$OPTARG" ;;
*) die "invalid switch -$OPTARG" ;;
esac
done
shift "$((OPTIND - 1))"
echo depth="$depth"
echo files="$@"