script bash que lê a entrada do usuário e usa o comando “cal” para validar datas

3

Eu quero escrever um script que leia minha entrada (por exemplo, se meu script é chamado de "check", então eu digitaria "check 9 4 1993" e essa entrada passaria pelo comando cal e verificaria o calendário se é uma data válida ou não).

Eu tenho a maior parte da minha ideia, mas não tenho certeza de qual abordagem usar na minha sintaxe. (Eu sou bastante novo para bash scripting então tenha paciência comigo por favor).

Minha idéia abaixo é que, se a entrada que passar pelo comando cal fornecer um erro, isso significará que não é uma data válida e vice-versa, se não houver erro, se a data for válida. Eu percebo que há algo terrivelmente errado com este rascunho (não consigo descobrir como fazer com que minha entrada passe pelo comando cal), mas apreciarei algumas sugestões. Aqui está o rascunho de qualquer maneira:

#!/bin/bash

day=$1; month=$2; year=$3
day=$(echo "$day" | bc)
month=$(echo "$month" | bc)
year=$(echo "$year" | bc)

cal $day $ month $year 2> /dev/null
if [[$? -eq 0 ]]; then
   echo "This is a valid date"
else
   echo "This is an invalid date"
fi
    
por grinke 08.10.2014 / 17:32

3 respostas

3

Em algumas distribuições Linux que eu verifiquei (eg, Ubuntu 14.04), o pacote cal vem do BSD e não do GNU Coreutils. A versão do BSD não parece aceitar dias como parâmetro; apenas meses e anos. A versão do Ubuntu tem a opção -HYYYY-MM-DD, mas isso não parece ajudar.

Em vez disso, eu usaria o utilitário date . Assumindo o GNU Coreutils no Linux eu acho que eu iria reescrever seu script algo como:

#!/bin/bash

day=$((10#$1))
month=$((10#$2))
year=$((10#$3))

if date -d $year-$month-$day > /dev/null 2>&1; then
    # cal $month $year
    echo "This is a valid date"
else
    echo "This is an invalid date"
fi

Notas:

  • Estou usando a expansão aritmética do próprio shell para validar a entrada / remoção zeros à esquerda, em vez de forçar um novo processo bc para cada parâmetro
  • Estou usando data da GNU para analisar a entrada data
  • O comando date pode ser usado diretamente como a expressão condicional if . if funciona verificando os códigos de saída do processo. Geralmente, os executáveis [ ou [[ são usados, mas não há motivo para outros programas serem usados se saírem com códigos de saída úteis
  • Não tenho certeza se você realmente queria a saída cal para as datas corretas ou não. Se fizer isso, simplesmente remova o comentário da linha cal .
por 08.10.2014 / 19:24
1

[[ é na verdade um comando e, como outros comandos, você precisa de espaços em branco para separar seus argumentos:

if [[ $? -eq 0 ]]; then
# ...^
    
por 08.10.2014 / 17:45
1

Existe um espaço entre o seu dólar $ e a sua variável month :

cal $day $ month $year 2> /dev/null

Deve ser:

cal $day $month $year 2> /dev/null
    
por 08.10.2014 / 17:43