O Google não me ajudou.
#!/bin/sh
j1=`expr "$1"`
j2=`expr "$2"`
while [ $j1 -le $j2 ]; do
date=$(ncal -e $j1)
month=$($date | cut -f1 -d' ')
if [ $month=="April" ]; then
echo $date
fi
j1=`expr $j1 + 1`
done
Quero imprimir a data da páscoa apenas para os anos onde ela estiver no mês de abril (no intervalo entre os dois anos que passei como argumentos). Mas de alguma forma recebo a saída:
...
April 5 2015
./script.sh: 8: March: not found
March 27 2016
./script.sh: 8: April: not found
April 16 2017
O que significa “mês: não encontrado”? E por que imprime março embora eu só peça abril?
Tentei de várias maneiras e sempre acontecia algum erro.
Também preciso acrescentar a condição de que apenas sejam impressas as datas posteriores a 20 de abril, mas não consigo nem lidar com isso.
Responder1
Na linha
month=$($date | cut -f1 -d' ')
você executa o que quer que esteja $date
como um comando e canaliza sua saída para cut
.
Eu acho que você quer
month=$( printf '%s\n' "$date" | cut -f 1 -d ' ' )
aqui.
Além disso, não misture crases e $(...)
no mesmo script, é confuso. Basta usar $(...)
em vez disso.
A comparação de strings é feita com =
:
if [ "$month" = "April" ]; then
Certifique-se de colocar aspas duplas em suas variáveis. VerImplicações de segurança de esquecer de citar uma variável em shells bash/POSIX
Aritmética inteira pode ser feita usando $(( expression ))
. expr
é antiquado.
j1=$(( "$1" ))
j2=$(( "$2" ))
...
j1=$(( j1 + 1 ))