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.