Não é possível comparar Strings

Não é possível comparar Strings

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 $datecomo 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 ))

informação relacionada