Невозможно сравнить строки

Невозможно сравнить строки

Google мне не помог.

#!/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

Я хочу вывести дату Пасхи только для тех лет, где она приходится на месяц апрель (в диапазоне между двумя годами, которые я передал в качестве аргументов). Но каким-то образом я получаю вывод:

...

April 5 2015
./script.sh: 8: March: not found
March 27 2016
./script.sh: 8: April: not found
April 16 2017

Что значит "месяц: не найден"? И почему печатает март, хотя я запрашиваю только апрель?

Я пробовал разными способами, и всегда возникали какие-то ошибки.

Мне также нужно добавить условие, чтобы печатались только даты после 20 апреля, но я даже с этим не могу справиться.

решение1

На линии

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

вы выполняете все, что находится в $dateкоманде, и передаете ее вывод в cut.

Я думаю, ты хочешь

month=$( printf '%s\n' "$date" | cut -f 1 -d ' ' )

здесь.

Также не смешивайте обратные кавычки и $(...)в одном сценарии, это сбивает с толку. Просто используйте $(...)вместо этого.

Сравнение строк выполняется с помощью =:

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

Обязательно заключайте переменные в двойные кавычки. См.Последствия для безопасности, если забыть заключить переменную в кавычки в оболочках bash/POSIX

Целочисленную арифметику можно выполнять с помощью $(( expression )). exprявляется устаревшей.

j1=$(( "$1" ))
j2=$(( "$2" ))

...

j1=$(( j1 + 1 ))

Связанный контент