Bem,
if [ "$1" == "" ] || [ $# -gt 1 ]; then echo "Parameter 1 is empty"
Primeiro, use = em vez de == . O primeiro é padrão, o segundo é um bashismo (embora eu também seja do ksh). Segundo, a lógica aqui não está correta: se $# for maior que , então o parâmetro 1 provavelmente não está vazio (embora possa ser configurado para a string vazia). Talvez você quisesse dizer "$#" -lt 1 , embora isso também implique que "$1" = "" . Deve ser o suficiente para testar [ "$1" = "" ] ou [ "$#" -lt 1 ] .
elif [! "${#timestamp}" -gt 10 ]; then
Aqui, o shell tentaria executar um comando chamado [! (literalmente). Você precisa de um espaço no meio, então [ ! "${#timestamp}" -gt 10 ] . Mas é o mesmo que [ "${#timestamp}" -le 10 ] , que também captura strings de exatamente 10 caracteres, como 2018-08-14 .
Então talvez você queira [ "${#timestamp}" -ne 10 ] . ( != em vez de -ne também funcionaria, mesmo que seja uma comparação de string.)
if ... exit 0
É habitual retornar com um código de saída diferente de zero em caso de erro, portanto, use exit 1 nas ramificações de erro.
Você também pode usar case ou [[ .. ]] para combinar o argumento com o formato esperado, por exemplo:
case "$1" in
"")
echo date is empty
exit 1;;
[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9])
echo date is ok;;
*)
echo "date is _not_ ok"
exit 1;;
esac
Isso também rejeitará argumentos como abcdefghij , mesmo com 10 caracteres.