Não é possível comparar Strings

1

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

Eu quero imprimir a data de páscoa somente para os anos em que está no mês de abril (no intervalo entre os dois anos em que eu passei como argumentos). Mas de alguma forma eu 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?

Eu tentei várias formas e sempre houve algum erro.

Também preciso adicionar a condição de que somente as datas impressas sejam posteriores ao dia 20 de abril, mas nem eu sou capaz de lidar com isso.

    
por Strict 31.05.2017 / 15:26

1 resposta

1

Na linha

month=$($date | cut -f1 -d' ')

você executa o que estiver em $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 backticks e $(...) no mesmo script, é confuso. Apenas use $(...) .

A comparação de strings é feita com = :

if [ "$month" = "April" ]; then

Não deixe de citar duas vezes suas variáveis. Veja Implicações de segurança do esquecimento 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 ))
    
por 31.05.2017 / 15:36