* Re: [Comm] Арифметика в bash
@ 2011-11-17 8:20 ` Константин Михайленко
` (3 subsequent siblings)
4 siblings, 0 replies; 7+ messages in thread
From: Константин Михайленко @ 2011-11-17 8:20 UTC (permalink / raw)
To: Vladimir Karpinsky, ALT Linux Community general discussions
Как вариант man bc.
Оно совсем мощно будет.. а так:
#!/bin/bash
a=73
b=22
let c=$a+$b
d=$(( $a - $b ))
echo $c
echo $d
Арифметика целочисленная, допустимые операции:
сложение
- вычитание
* умножение
/ деление
% остаток от деления
** возведение в степень
+= увеличение переменной на заданное число
-= уменьшение переменной на заданное число
*= умножение переменной на заданное число
/= деление переменной на заданное число
%= найти остаток от деления значения переменной на заданное число,
записать его в переменную
17 ноября 2011 г. 13:51 пользователь Vladimir Karpinsky
<vkarpinsky@mail.ru> написал:
> Здравствуйте!
>
> Уже некоторое время пытаюсь найти простое решение следующей проблемы: нужно
> производить простейшие арифметические операции (как правило + или -1 ;-)) с
> "юлианскими" днями года (date +%j). Сложность заключается в том, что формат
> такой даты JJJ, т.е. первые 99 дней года первая цифра 0, и bash считает это
> число восьмеричным, со всеми вытекающими последствиями. Хочется заставить
> bash работать с такими числами, как десятеричными, формат JJJ для результата
> вычисления желательно также сохранить.
>
> --
> С уважением,
> Владимир.
>
> _______________________________________________
> community mailing list
> community@lists.altlinux.org
> https://lists.altlinux.org/mailman/listinfo/community
>
^ permalink raw reply [flat|nested] 7+ messages in thread
[parent not found: <201111171217.36464.khedin@gmail.com>]
* Re: [Comm] Арифметика в bash
@ 2011-11-17 9:31 ` Vladimir Karpinsky
0 siblings, 0 replies; 7+ messages in thread
From: Vladimir Karpinsky @ 2011-11-17 9:31 UTC (permalink / raw)
To: ALT Linux Community general discussions
17 ноября 2011, 12:19 от "Konstantin S. Uvarin" <khedin@gmail.com>:
> Так пусть date и считает.
>
> JJJ=031
> date -d "`date +%Y-1-1` + $JJJ days - 1 week"
Спасибо, я как-то об этом не подумал. По мотивам получилось так:
#!/bin/bash
jTODAY=`date +%j`
YEAR=`date +%Y`
DAY=`date -d 20110101 +%Y-%m-%d`
jDAY=`date -d 20110101 +%j`
until [ "$jDAY" -gt "$jTODAY" ]
do
file="$YEAR"/"$jDAY".dat
[ ! -f $file ] && echo "File $file is absent"
DAY=`date -d "$DAY + 1 day" +%Y-%m-%d`
jDAY=`date -d $DAY +%j`
done
Вероятно можно ещё красивше сделать...
--
С уважением,
Владимир.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Comm] Арифметика в bash
2011-11-17 8:20 ` [Comm] Арифметика в bash Константин Михайленко
@ 2011-11-17 9:35 ` Yura Kalinichenko
2011-11-17 15:50 ` Sergey Vlasov
4 siblings, 0 replies; 7+ messages in thread
From: Yura Kalinichenko @ 2011-11-17 9:35 UTC (permalink / raw)
To: Vladimir Karpinsky, ALT Linux Community general discussions
Vladimir Karpinsky пишет:
> Здравствуйте!
>
> Уже некоторое время пытаюсь найти простое решение следующей проблемы:
> нужно производить простейшие арифметические операции (как правило +
> или -1 ;-)) с "юлианскими" днями года (date +%j). Сложность
> заключается в том, что формат такой даты JJJ, т.е. первые 99 дней года
> первая цифра 0, и bash считает это число восьмеричным, со всеми
> вытекающими последствиями. Хочется заставить bash работать с такими
> числами, как десятеричными, формат JJJ для результата вычисления
> желательно также сохранить.
[yuk@yuk ~]$ day="08" ; atom=`expr $day + 2` ; echo "Послезавтра = $atom"
Послезавтра = 10
[yuk@yuk ~]$ day=1 ; mon=3 ; year=2011 ; date=`printf "%02d.%02d.%d" $day $mon $year` ; echo $date
01.03.2011
--
SY,
Yura Kalinichenko
^ permalink raw reply [flat|nested] 7+ messages in thread
[parent not found: <CAFv-R3c07ac7_TO34w2XAM0N67qjwDBNfRrrX7ids5f562hMA@mail.gmail.com>]
* Re: [Comm] Арифметика в bash
@ 2011-11-17 9:50 ` Vladimir Karpinsky
2011-11-17 9:53 ` Vladimir Karpinsky
0 siblings, 1 reply; 7+ messages in thread
From: Vladimir Karpinsky @ 2011-11-17 9:50 UTC (permalink / raw)
To: ALT Linux Community general discussions
17 ноября 2011, 13:21 от Константин Михайленко <const.mkh@gmail.com>:
> > Возьмите здесь a=009 и Вы поймёте, что я имею ввиду.
>
> про bc не зря упомянуто
Да, с bc получается, спасибо. Там только придётся отслеживать необходимость дописывания ноликов в начале числа для сохранения формата JJJ. В конкретном случае вариант заставить считать date, предложенный Константином Ивановым, выглядит предпочтительнее.
--
С уважением,
Владимир.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Comm] Арифметика в bash
` (3 preceding siblings ...)
@ 2011-11-17 15:50 ` Sergey Vlasov
2011-11-17 16:06 ` Vladimir Karpinsky
4 siblings, 1 reply; 7+ messages in thread
From: Sergey Vlasov @ 2011-11-17 15:50 UTC (permalink / raw)
To: community
[-- Attachment #1: Type: text/plain, Size: 1055 bytes --]
On Thu, Nov 17, 2011 at 11:51:09AM +0400, Vladimir Karpinsky wrote:
> Уже некоторое время пытаюсь найти простое решение следующей
> проблемы: нужно производить простейшие арифметические операции (как
> правило + или -1 ;-)) с "юлианскими" днями года (date +%j).
> Сложность заключается в том, что формат такой даты JJJ, т.е. первые
> 99 дней года первая цифра 0, и bash считает это число восьмеричным,
> со всеми вытекающими последствиями. Хочется заставить bash работать
> с такими числами, как десятеричными, формат JJJ для результата
> вычисления желательно также сохранить.
Именно в bash поддерживается синтаксис вида BASE#NUMBER с явным
указаним основания:
$ bash -c 'a=011; echo $((10#$a))'
11
Нужно учитывать, что в POSIX sh такой синтаксис не поддерживается,
поэтому в скриптах нужно явно указывать #!/bin/bash (использование
#!/bin/sh в ALT пока не проявится в виде ошибок, но в некоторых
дистрибутивах в роли /bin/sh может оказаться, например, dash).
Выводить числа в нужном формате можно через printf '%03d' $n .
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 198 bytes --]
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Comm] Арифметика в bash
2011-11-17 15:50 ` Sergey Vlasov
@ 2011-11-17 16:06 ` Vladimir Karpinsky
0 siblings, 0 replies; 7+ messages in thread
From: Vladimir Karpinsky @ 2011-11-17 16:06 UTC (permalink / raw)
To: community
17.11.2011 19:50, Sergey Vlasov пишет:
> On Thu, Nov 17, 2011 at 11:51:09AM +0400, Vladimir Karpinsky wrote:
>> Уже некоторое время пытаюсь найти простое решение следующей
>> проблемы: нужно производить простейшие арифметические операции (как
>> правило + или -1 ;-)) с "юлианскими" днями года (date +%j).
>> Сложность заключается в том, что формат такой даты JJJ, т.е. первые
>> 99 дней года первая цифра 0, и bash считает это число восьмеричным,
>> со всеми вытекающими последствиями. Хочется заставить bash работать
>> с такими числами, как десятеричными, формат JJJ для результата
>> вычисления желательно также сохранить.
>
> Именно в bash поддерживается синтаксис вида BASE#NUMBER с явным
> указаним основания:
>
> $ bash -c 'a=011; echo $((10#$a))'
> 11
>
> Нужно учитывать, что в POSIX sh такой синтаксис не поддерживается,
> поэтому в скриптах нужно явно указывать #!/bin/bash (использование
> #!/bin/sh в ALT пока не проявится в виде ошибок, но в некоторых
> дистрибутивах в роли /bin/sh может оказаться, например, dash).
>
> Выводить числа в нужном формате можно через printf '%03d' $n .
Спасибо! Где-то я похоже не там искал. Я, ведь, даже пытался
форматированный вывод искать...
--
С уважением,
Владимир.
^ permalink raw reply [flat|nested] 7+ messages in thread