verifica os argumentos da linha de comando

0

Gostaria de verificar se o primeiro argumento de linha de comando ( $1 ) tem uma quantidade mínima de 10 caracteres e se está vazio.

O script é chamado como:

./myscript.sh 2018-08-14

Eu tentei isso, mas não funciona

timestamp="$1"

# check if command line argument is empty or not present
if [ "$1" == "" ] || [ $# -gt 1 ]; then
        echo "Parameter 1 is empty"
        exit 0
elif [! "${#timestamp}" -gt 10 ]; then
        echo "Please enter at least a valid date"
        echo "Example: 2018-08-14"
        exit 0
else
        echo "THIS IS THE VALID BLOCK"
fi
    
por user305422 14.08.2018 / 15:55

2 respostas

2

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.

    
por 14.08.2018 / 16:24
0

Experimente o script abaixo,

Opção1

timestamp="$1"

# check if command line argument is empty or not present
if [ -z $1 ]; then
        echo "Parameter 1 is empty"
        exit 0
elif [ "${#timestamp}" -lt 10 ]; then
        echo "Please enter at least a valid date"
        echo "Example: 2018-08-14"
        exit 0
else
        echo "THIS IS THE VALID BLOCK"
fi

Opção2

[[ $1 =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]] && date -d "$1"
    
por 14.08.2018 / 16:12