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 linhacal
.