LINUX.ORG.RU

Прошу поругать скрипт

 , ,


0

1

Всем привет!

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

Буду рад конструктивной критике. Код:

#!/bin/bash
echo "Введите день рождения."
echo "Если вы родились, например, 2 числа - нужно вводить 2, а не 02"
read day
echo "Введите месяц рождения."
echo "Если вы родились, например, в марте - нужно вводить 3, а не 03"
read month
echo "Введите год рождения в формает XXXX"
read year
echo "Ваша дата рождения:" $day.$month.$year
today_day=`date +%-d`
today_month=`date +%-m`
today_year=`date +%Y`
#вычисление разницы
let "day_diff = today_day - day"
let "month_diff = today_month - month"
let "year_diff = today_year - year"
if [ $day_diff -ge 0 ] & [ $month_diff -ge 0 ] ;
then
        echo "Ваш возраст:" $year_diff
else
#В этом случае у человека День Рождения в этом году еще на настал - разница с $year_diff в 1 год.
        let "no_birthday = year_diff - 1"; echo "Ваш возраст:" $no_birthday
fi
★★

Прошу поругать скрипт

Ай, какой скрипт нехороший! Козлина эдакая! Сволочина ленивая!!!

А зачем такие сложности? Можно же просто вычислить юлианскую дату рождения человека, найти разницу между текущей юлианской датой и получить его возраст с точностью до суток…

Eddy_Em ☆☆☆☆☆
()

Как сложно все. Не знаю как на баше, но в других языках можно просто перевести дату в unix-формат, а из него достать возраст.

vurdalak ★★★★★
()

http://fpaste.org/j6SC/ Сообразил, что нет проверки вводимых данных. Получилась вообще простыня ужасная :) И сдается мне, что укоротить это дело уже не получится.

Eddy_Em Посмотрел, как она вычисляется - ужас же! :) Хотя точность до суток, конечно, весьма приятный момент. vurdalak Не совсем понял, а как по ней можно вычислить время?

kir64 ★★
() автор топика
Ответ на: комментарий от kir64

lllnk

Функцию сделай, чтоли.

invalid_input() { 
echo "Введена неправильная дата: $1"; 
exit 1;
}

Вообще не привыкай ничего копипастить.

lllnk
()
Ответ на: комментарий от lllnk

Это для case? Имхо, его вообще можно убрать спокойно - он только эстетики придает, а фактически на вычисление возраста не влияет никак

kir64 ★★
() автор топика
Ответ на: комментарий от gentoo_root
#!/bin/bash

read -p 'Дата рождения (YYYY-MM-DD): ' date
start="`date +%s -d "$date"`" || exit 1
end="`date +%s`"
diff=$(((end - start)/31536000))
echo "Вам $diff лет"
derlafff ★★★★★
()
Ответ на: комментарий от gentoo_root

Шикарно! Взял на заметку. Большое спасибо. И vurdalak тоже!

kir64 ★★
() автор топика
Ответ на: комментарий от kir64

Посмотрел, как она вычисляется - ужас же! :)

Т.к. вряд ли вы найдете человека, который будет старше 70..80 лет, то можно не париться и считать UNIX-time.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Т.к. вряд ли вы найдете человека, который будет старше 70..80 лет, то можно не париться и считать UNIX-time.

А в чем проблема? Время в секундах вполне может быть отрицательным, всё нормально посчитается

Дата рождения (YYYY-MM-DD): 1920-12-12
Вам 91 лет

И даже

Дата рождения (YYYY-MM-DD): 2037-12-12
Вам -25 лет

derlafff ★★★★★
()
Ответ на: комментарий от Eddy_Em

Да уж, с нашим уровнем и продолжительностью жизни... Только UNIX-time остается.

kir64 ★★
() автор топика
Ответ на: комментарий от derlafff

А в чем проблема?

В переходе на григорианский календарь!

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от anonymous

Как-то это не по-пацански давать переменным имена системных утилит. Это я про diff.

К переменной обращаюсь «$diff», а к программе «diff», никаких проблем такое название не приносит.

gentoo_root ★★★★★
()
Ответ на: комментарий от derlafff

31536000

Вот только эта константа не учитывает високосные годы.

gentoo_root ★★★★★
()
Ответ на: комментарий от vurdalak

Не знаю как на баше, но в других языках можно просто перевести дату в unix-формат

Ну ты сравнил....где баш, а где unix.
Это ведь настолько далёкие друг от друга вещи, что ну прям вот воще никак тут без ruby не обойтись

zolden ★★★★★
()

Ещё вариант:

echo -n "Enter date YYYY-MM-DD: "
read born_date
echo -n "Ваш возраст: " 
echo $(( $(date +%s) - $(date +%s -d "${born_date}") )) \
     | awk '{print strftime("%Y",$1)-1970}'

Slavaz ★★★★★
()

Лучше (и правильнее) вводить 02 и 03, а не 2 и 3.

XoFfiCEr ★★☆☆
()
Ответ на: комментарий от Kalashnikov

Это не первая ошибка, это первый опыт. Когда время свободное есть - пистон3 изучаю.

kir64 ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.