O problema está aqui:
if [ -z "MAXFILES" ]
then
MAXFILES=10
fi
# ...
if [ $# -gt "$MAXFILES" -a "$MAXFILES" -ne 0 ]
Você está verificando se a string MAXFILES é zero. Como não é, $MAXFILES nunca é definido e, portanto, seu teste posterior é lexing como:
if [ $# -gt "" -a "" -ne 0 ]
É por isso que está reclamando da necessidade de um número inteiro.
O que você quer fazer é isto:
if [[ -z "$MAXFILES" ]]; then
MAXFILES=10
fi
A diferença é o cifrão, que você está perdendo. Além disso, tenho a tendência de usar [[ ]] em vez de [ ] para testes (ao usar bash ), pois eles têm algumas verificações de sanidade incorporadas e são mais versáteis do que [ e test .