Bash/Арифметические выражения

Материал из Xgu.ru

Перейти к: навигация, поиск
'перевод http://wiki.bash-hackers.org/syntax/arith_expr'

Содержание

[править] Арифметические выражения

Арифметические выражения используются в следующих случаях:

  • команда арифметического вычисления
  • подстановки арифметических вычислени
  • подстановки для вычисления параметров подстроки
  • встроенная команда "let"
  • циклы в стиле языка программирования C
  • индексация массива
  • выражения для условий

Арифметические выражения - это выражения , которые вычисляются по некоторым правилам, которые описаны ниже. Операторы и правила арифметических выражений в основном унаследованы из языка программирования C/

Эта статья описывает теорию использования синтаксиса и поведения оболочки.

[править] Константы

Математические константы - просто фиксированные значения, которые Вы пишете: 1, 3567, или 4326. Bash интерпретирует некоторые виды записей по-своему:

0... (лидирующий нуль) интерпретируется как восьмеричное значение
0x... интерпретируется как шестнадцатеричное значение
0X... также интерпретируется как шестнадцатеричное
<BASE>#... интерпретируется как число согласно указанной основе <BASE>, например: 2#00111011

Если вы значение константы присваиваете переменной так:

x=03254

bash будет интерпретировать как восьмеричное значение. Если Вы хотите, чтобы это было интерпретировано как десятичное значение, Вы должны привести параметр к десятичному основанию 10:

# такое будет интерпретироваться как десятичное значение:
echo $(( 10#$x ))

# такое будет интерпретироваться как восьмеричная:
echo $(( x ))

# в таком случае значение будет неверным, т.к. x, интерпретированное как восмеричное число  - неверно для основания  10:
echo $(( 10#x )

[править] Различные основания исчисления

Для константы основание может быть определена, при определении в такой форме:

<ОСНОВАНИЕ>#<ЦИФРЫ...> Независимо от указанного основания арифметическое выражение, будет отображаться на экране то десятичной форме!

Если основание не определено, то считается что основание 10 (десятичное число) за исключением тех случаев, если были использованы упомянутые выше префиксы (octals, hexadecimals). Основание может быть от 2 до 64. Если указано основание больше 10, и то вместо цифр больше 10, латинский алфавит: a..z, потом заглавные буквы A-Z, и символы @ и _:

Быстро давайте покажем что происходит в системе по основанию 43, чтобы было ясно:

$ echo $((43#1))
1

$ echo $((43#a))
10

$echo $((43#A))
36

$ echo $((43#G))
42

$ echo $((43#H))
bash: 43#H: value too great for base (error token is "43#H")

для постройки таблицы соответствий симолов цифрам используйте такой скрипт:

for i in {0..9} {a..z} {A..Z} @ _ ; do echo $i $(( 64#$i )) ; done


Если у вы понятия не имеете что такое основание и где оно может испрользоваться, то скорее всего оно вам не нужно.

Если Вы хотите преобразовать между обычными основами (восьмеричная, десятичная, шестнадцатеричная), используйте строку форматирования команды printf.

[править] Переменные оболочки

Переменные оболочки конечно могут использоваться в качестве операндов, даже если атрибут целочисленной переменной не включен (declare -i <NAME>). Если переменная (null) или сброшена (unset), при разыменовании такая переменная будет значить 0. Если переменная содержит не целочисленное значение или оператор, а нечто, похожее ссылку на другое арифметическое выражение, то при возможности bash перепройдется по ссылкам и именованым параметрам и вычислит значение такого выражения. Напримре:

test=string
string=3
$ echo ((test))
# выведет "3"


Конечно, если в конце разыменовываний получится недопустимое арифметическое выражение (перевод строки, обычный текст...) тогда, вы получите ошибку. Форма записи 1 + $X эквивалентна нотации 1 + X, и обои варианты разрешены.

When variables are referenced like $X, the rules of parameter expansion apply and are performed before the expression is evaluated. Thus, a construct like ${MYSTRING:4:3} is valid inside an arithmetic expression.