Linux, улучшенный вызов, программирование оболочки - PullRequest
2 голосов
/ 01 декабря 2011

Я работаю с Кэл для выполнения домашнего задания, и я застрял в одной точке.

Вряд ли кто-то действительно заинтересован в получении григорианского календарь на год в первом веке, время, когда григорианский календарь даже не существовал. Используйте «оконную» стратегию, чтобы new cal для обработки лет, которые не являются полными четырьмя цифрами года. Если год находится в диапазоне 0 <= год <= 50, предположим, что год действительно 2000-2050. Если год находится в диапазоне 51 <= год <= 99, предположим, что год действительно 1951-1999. </p>

файл с именем улучшенным cal.sh например, вызовите оболочку с sh Improcal.sh 1 2011 код

case $# in 

# rando stuff

*) m=$1; y=$2 ; # 2 ags: month and year
if ((y >= 0 && y <= 50)); then  
y+=2000
elif ((y >= 51 && y <= 99)); then
y+=1900
fi;;
esac

case $m in
jan*|Jan*) m=1 ;;
feb*|Feb*) m=2 ;;
mar*|Mar*) m=3 ;;
apr*|Apr*) m=4 ;;
may*|May*) m=5 ;;
jun*|Jun*) m=6 ;;
jul*|Jul*) m=7 ;;
aug*|Aug*) m=8 ;;
sep*|Sep*) m=9 ;;
oct*|Oct*) m=10 ;;
nov*|Nov*) m=11 ;;
dec*|Dec*) m=12 ;;
[1-9]|10|11|12) ;; # numeric month
0[1-9]|010|011|012) ;; # numeric month
# *) y=$m; m="" ;; # plain year
esac

/usr/bin/cal $m $y # run cal with new inputs

Но это почему-то не работает, у кого-нибудь есть указатели для меня? По какой-то причине он просто пропускает эту часть.

Ответы [ 2 ]

1 голос
/ 12 января 2013

Если вы не объявляете переменную и не присваиваете ей напрямую, то это либо строка (var=stuff), либо массив (var=(element0 element1 element2)). Поскольку y является строкой, y+=2000 добавляет строку 2000 к значению.

Вы можете объявить y как целочисленную переменную, тогда оператор += выполнит сложение.

declare -i y=$2
if ((y >= 0 && y <= 50)); then  
  y+=2000
elif ((y >= 51 && y <= 99)); then
  y+=1900
fi

Другой способ - использовать оператор += внутри арифметического выражения:

y=$2
if ((y >= 0 && y <= 50)); then  
  ((y+=2000))
elif ((y >= 51 && y <= 99)); then
  ((y+=1900))
fi

Или вы можете выполнить арифметическую операцию и присвоить результат:

y=$2
if ((y >= 0 && y <= 50)); then  
  y=$((y+2000))
elif ((y >= 51 && y <= 99)); then
  y=$((y+1900))
fi

Вы можете написать все это в одном арифметическом выражении, используя условный оператор ? … ::

y=$2
if ((y >= 0)); then ((y <= 50 ? y += 2000 : y <= 99 ? y+=1900 : 0)); fi
0 голосов
/ 01 декабря 2011

Попробуйте запустить свой скрипт с bash -xv, это поможет вам понять, что происходит.

Читайте также Введение в программирование Bash

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...