ALT Linux Community general discussions
 help / color / mirror / Atom feed
* 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

* 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

* 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
  2011-11-17  9:50     ` Vladimir Karpinsky
@ 2011-11-17  9:53       ` Vladimir Karpinsky
  0 siblings, 0 replies; 7+ messages in thread
From: Vladimir Karpinsky @ 2011-11-17  9:53 UTC (permalink / raw)
  To: ALT Linux Community general discussions

17 ноября 2011, 13:51 от Vladimir Karpinsky <vkarpinsky@mail.ru>:
Константином Ивановым
                        
Sorry, Константином Увариным, конечно.
 
--
  С уважением,
        Владимир.

^ 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

end of thread, other threads:[~2011-11-17 16:06 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-11-17  8:20   ` [Comm] Арифметика в bash Константин Михайленко
2011-11-17  9:31     ` Vladimir Karpinsky
2011-11-17  9:35   ` Yura Kalinichenko
2011-11-17  9:50     ` Vladimir Karpinsky
2011-11-17  9:53       ` Vladimir Karpinsky
2011-11-17 15:50   ` Sergey Vlasov
2011-11-17 16:06     ` Vladimir Karpinsky

ALT Linux Community general discussions

This inbox may be cloned and mirrored by anyone:

	git clone --mirror http://lore.altlinux.org/community/0 community/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 community community/ http://lore.altlinux.org/community \
		mandrake-russian@linuxteam.iplabs.ru community@lists.altlinux.org community@lists.altlinux.ru community@lists.altlinux.com
	public-inbox-index community

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://lore.altlinux.org/org.altlinux.lists.community


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git