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