URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 84527
[ Назад ]

Исходное сообщение
"Простейшая арифметика."

Отправлено stakado , 17-Мрт-09 14:28 
Здравствуйте!
То ли от долгого сидения за черным экраном, то ли из-за недостатка знаний не могу выполнить простейшую арифметическую операцию - сложить переменную с числом. Вот скрипт:
[root@gtw new_router]# cat 1.sh
#!/bin/bash

tmp="07"
echo "1. tmp + 1 = $[ $tmp + 1 ]"
tmp="08"
echo "2. tmp + 1 = $[ $tmp + 1 ]"

А вот результат выполнения скрипта:
[root@gtw new_router]# ./1.sh
1. tmp + 1 = 8
./1.sh: line 6: 08: value too great for base (error token is "08")

Укажите, пожалуйста, на ошибку.


Содержание

Сообщения в этом обсуждении
"Простейшая арифметика."
Отправлено Andrey Mitrofanov , 17-Мрт-09 14:37 
>tmp="08"

<tmp="^----указываю. Не за что.

( ^--- - это _стрелочка_, да-а-а?)

>./1.sh: line 6: 08: value too great for base (error token is
>"08")
>Укажите, пожалуйста, на ошибку.


"Простейшая арифметика."
Отправлено stakado , 17-Мрт-09 14:44 
>>tmp="08"
>
><tmp="^----указываю. Не за что.
>
>( ^--- - это _стрелочка_, да-а-а?)
>
>>./1.sh: line 6: 08: value too great for base (error token is
>>"08")
>>Укажите, пожалуйста, на ошибку.

Наскока я понял указывает эта стрелочка на "0". Почему тогда "07" работает? Везде утверждается, что переменные в баше не имеют типа. Так что "08" и "8" должны быть идеинтичны. С просто "8" пробовал, работает оно, но мне без этого нуля впереди ну никак не обойтись.
Есть ли какие-нить методики, чтобы побороться с этим?


"Простейшая арифметика."
Отправлено Andrey Mitrofanov , 17-Мрт-09 14:56 
>Наскока я понял указывает эта стрелочка на "0".

Ну, в общем, да. Корректенее было бы, наверное на "08" целиком указать...
И сообщение об ошибке тебе на него "указывало", жаль стрелочек не рисовало.

> Почему тогда "07" работает?

077 попробуй. Выводы?

>Везде утверждается, что переменные в баше не имеют типа.
>Так что "08" и "8" должны быть идеинтичны.

Если это переменные, то я Дональд Кнут.

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

С чем? С "ну никак не"?... Медитация, аутотренинт, выработка храрактера.

ЗЫ: Убойнейшая мантра для медитационной закалки характера:
man bash


"Простейшая арифметика."
Отправлено stakado , 17-Мрт-09 15:13 
>[оверквотинг удален]
>
>Если это переменные, то я Дональд Кнут.
>
>>но мне без этого нуля впереди ну никак не обойтись.
>>Есть ли какие-нить методики, чтобы побороться с этим?
>
>С чем? С "ну никак не"?... Медитация, аутотренинт, выработка храрактера.
>
>ЗЫ: Убойнейшая мантра для медитационной закалки характера:
>man bash

В общем-то Андрей спасибо, не раз с Вами сталкиваюсь на просторах форума опеннета, Вы как всегда очень красноречивы, вот тока толка от ваших советов маловато. Уподобляться Вам не стану, лишь опишу решение (как написано в правилах форума).

Проблема решилась с помощью Яндекса.
Заключалась она в том, что баш по какой-то неведомой мне причине (наверное дефолты такие или 0 впереди на это указывает) воспринимал мою переменную как 8ричную и соответственно числа 8 существовать в ней не может. Для того, чтобы баш воспринимал переменную как 10чную необходимо указать ему это явным образом - 10#$tmp. Пример исправленного скрипта:
[root@gtw new_router]# cat 1.sh
#!/bin/bash

tmp="07"
echo "1. tmp + 1 = $[ $tmp + 1 ]"
tmp="08"
echo "2. tmp + 1 = $[ 10#$tmp + 1 ]"

И результат выполнения:
[root@gtw new_router]# ./1.sh
1. tmp + 1 = 8
2. tmp + 1 = 9


"Простейшая арифметика."
Отправлено Andrey Mitrofanov , 17-Мрт-09 15:46 
>В общем-то Андрей спасибо, не раз с Вами
>Проблема решилась с помощью Яндекса.
>как 10чную необходимо указать ему это явным образом - 10#$tmp

Ну, что Вы, это Вам спасибо: я не знал.
man bash - каждый раз либо что-то новое, либо что-то пропустил.


"Простейшая арифметика."
Отправлено angra , 17-Мрт-09 15:55 
Ну конечно яндекс это проще чем man bash. Ну и остаются в памяти глупые мысли про дефолты и шаманские заклинания. Андрей действительно витиевато выражается и, о ужас, требуется чуть-чуть напрячь извилины дабы понять куда он клонит. Многим это удается и для них толк от советов Андрея есть. Но некоторым конечно сложить вместе указание на base от bash, указание на 0 и предложение попробовать с 077(на выходе будет 64, оно же 0100 в восьмеричной) наверное действительно оказалось слишком сложно.

"Простейшая арифметика."
Отправлено Владимир , 14-Ноя-16 11:33 
> В общем-то Андрей спасибо, не раз с Вами сталкиваюсь на просторах форума
> опеннета, Вы как всегда очень красноречивы, вот тока толка от ваших
> советов маловато. Уподобляться Вам не стану, лишь опишу решение (как написано
> в правилах форума).

Спасибо тебе, добрый человек. Сколько же ты мне времени сэкономил.. В отличии от ответов выше..