Числовые переменные в Bash

Введение в Bash-скриптинг

Alex Scriven

Data Scientist

Числа в других языках

Числа не поддерживаются оболочкой так же нативно, как в большинстве REPL (консолей), например R или Python

В Python или R можно написать:

>>> 1 + 4
5

И получить ожидаемый результат!

Введение в Bash-скриптинг

Числа в оболочке

 

Числа не поддерживаются нативно:

(В терминале)

1 + 4
bash: 1: command not found
Введение в Bash-скриптинг

Знакомство с expr

 

expr — удобная утилита (как cat или grep)

Теперь это сработает (в терминале):

expr 1 + 4
5

Отлично!

Введение в Bash-скриптинг

Ограничения expr

expr не поддерживает десятичные числа нативно:

(В терминале)

expr 1 + 2.5
expr: not a decimal number: '2.5'

Но не беспокойтесь! (Решение есть)

Введение в Bash-скриптинг

Знакомство с bc

bc (базовый калькулятор) — полезная программа командной строки.

Её можно запустить в терминале и выполнять вычисления:

Использование программы BC в оболочке

Введение в Bash-скриптинг

Передача чисел в bc

 

Можно использовать bc, не открывая калькулятор — с помощью конвейера:

echo "5 + 7.5" | bc
12.5
Введение в Bash-скриптинг

Аргумент scale в bc

У bc есть аргумент scale для задания числа знаков после запятой.

echo "10 / 3" | bc
3
echo "scale=3; 10 / 3" | bc

Обратите внимание: ; разделяет «строки» в терминале

3.333
Введение в Bash-скриптинг

Числа в Bash-скриптах

Числовые переменные присваиваются так же, как строковые:

dog_name='Roger'
dog_age=6

echo "My dog's name is $dog_name and he is $dog_age years old"

Учтите: dog_age="6" тоже сработает, но превратит значение в строку!

My dog's name is Roger and he is 6 years old
Введение в Bash-скриптинг

Нотация с двойными скобками

Альтернативная запись с двойными скобками для числовых переменных:

expr 5 + 7
echo $((5 + 7))
12
12

Учтите: этот метод использует expr, а не bc (без десятичных чисел!)

Введение в Bash-скриптинг

Оболочка внутри оболочки: продолжение

Помните, как мы обращались к оболочке в предыдущем уроке?

Это очень удобно для числовых переменных:

model1=87.65
model2=89.20

echo "The total score is $(echo "$model1 + $model2" | bc)"
echo "The average score is $(echo "($model1 + $model2) / 2" | bc)"
The total score is 176.85
The average score is 88
Введение в Bash-скриптинг

Давайте потренируемся!

Введение в Bash-скриптинг

Preparing Video For Download...