Eu participo junto ao Aurelio Jargas do projeto FuncoesZZ (http://funcoeszz.net/) e lá temos um recurso que usamos normalmente associando o case e while, seria algo assim no seu caso:
while test "${1#-}" != "$1" do case "$1" in -p | --project) opcao=1; shift ;; -s | --subproject) opcao=2; shift ;; -f | --file) opcao=3; shift ;; --) shift ;; *) break;; esac done echo "Opção $opcao"