Addition of two floating point numbers using shell script
will fix the second half of your problem that you have not yet got to. Your first problem is a mystery. » [ » is a built-in command so unless there are quotation marks you are not showing us I can’t see how it can take [ $# != 2 ] as a single word.
Supposing the script is called add , or for those who prefer easily pasted code try this workalike shell function : add() < n="$@"; bc "; > ; both function and script work like this:
add 3.2 5.5 add 3.2 5.5 8.9 add .
The curly braces use bash brace expansion to create about 4000 strings that bc interprets as decimal numbers ranging from 1.12 to 51.89.
Note how there’s no need to check for two arguments:
- it can add one or more arguments,
- no arguments returns no output.
- it ignores ordinary strings, so add 5 6.7 abc edf 9 returns 20.7 .
- it returns a syntax error if a number isn’t right, e.g.: 9z , 5.6.7 , 8.. , etc.
Use this to add two floating numbers.
Just replace the numbers with your variables.
#!/bin/bash if [ $# != 2 ]; then echo "2 arguments are required " exit else x=$1 y=$2 sum = $x + $y echo ` sum = $sum | bc ` fi
- All variable substitutions should be double-quoted: http://unix.stackexchange.com/questions/171346/security-implications-of-forgetting-to-quote-a-variable-in-bash-posix-shells
- Arithmetic comparison for inequality is done with [ . -ne . ] .
- Diagnostic output, i.e. errors and warnings, should go to standard error.
- When exiting on an error condition, a non-zero exit status should be returned to the calling shell.
- Assignments do not accept spaces around = .
With these things in mind, your code becomes
#!/bin/sh if [ "$#" -ne 2 ]; then echo >&2 'Expected two arguments' exit 1 fi printf 'sum = %f\n' "$( printf '%f + %f\n' "$1" "$2" | bc )"
Alternatively, with a couple of bash extensions:
#!/bin/bash if (( $# != 2 )); then echo >&2 'Expected two arguments' exit 1 fi printf 'sum = %f\n' "$( bc
With intermediate variables:
#!/bin/bash if (( $# != 2 )); then echo >&2 'Expected two arguments' exit 1 fi x="$1" y="$2" sum="$( bc
Modify the printf formatting string to suit your needs. If you, for example, want two decimals, use %.2f instead of %f .
Арифметические операции в Bash скрипте
let это встроенная функция bash, которая позволяет производить базовые арифметические операции.
Используется следующим образом:
Рассмотрим примеры в скрипте let_example.sh
#!/bin/bash # Простая арифметика с let let A=5+4 echo $A # 9 let "A = 5 + 4" echo $A # 9 let A++ echo $A # 10 let "A = 4 * 5" echo $A # 20 let "A = $1 + 30" echo $A # 30 + первый аргумент из командной строки
Разберём команды по очереди:
Строка 4 - Это простейшая форма записи без кавычек.
Помните, что если вычисление идёт без кавычек - ставить пробелы нельзя
Строка 7 - Если поставить кавычки - можно пользоваться пробелом для лучшей читаемости.\
Строка 10 - Увеличиваем значение на 1. Это аналог "a = a + 1".
Строка 16 - В выражение можно включить и другие переменные.
Таблица основных операторов
expr
expr похож на let за исключением того, что вместо сохранения результата в переменную expr по умолчанию печатает ответ.
Но никто не запрещает сохранять результат expr в переменные с помощью command substitution: x = $(expr 2 + 2)
В отличие от let не нужно заключать выражения с пробелами в кавычки
Нужно ставить пробелы вокруг операторов.
expr item1 operator item2
Рассмотрим простой пример:
#!/bin/bash # Простая арифметика с использованием expr expr 5 + 4 expr "5 + 4" expr 5+4 expr 5 \* $1 expr 11 % 2 A= $( expr 10 - 3 ) echo $A # 7
Разберём этот пример пошагово:
Строка 4 - Это базовый синтаксис. Обратите внимание на пробелы и на отсутствие кавычек.
Строка 6 - Если заключить выражение в кавычки его в таком виде и выведет в терминал.
Строка 8 - Если не поставить пробелы выражение будет выведено в терминал без вычисления.
Строка 10 - Некоторые символы нужно экранировать.
Строка 12 - Это деление по модулю. Результатом будет остаток от целочисленного деления двух чисел.
Строка 14 - Пример выполнения command substitution чтобы сохранить результат в переменную a.
Двойные скобки
Результат выполнения команды можно легко сохранить в переменную.
На основе этого механизма можно выполнять арифметические действия. Достаточно вместо одной пары скобок использовать две.
Рассмотрим примеры в скрипте
#!/bin/bash # Простая арифметика с двойными скобками A= $(( 4 + 5 )) echo $A # 9 A= $((3+5)) echo $A # 8 B= $(( A + 3 )) echo $B # 11 B= $(( $A + 4 )) echo $B # 12 (( B++ )) echo $B # 13 (( B += 3 )) echo $B # 16 A= $(( 4 * 5 )) echo $A # 20
Строка 4 - Базовый синтаксис. Можно ставить пробелы без использования кавычек.
Строка 7 - Работает и без пробелов.
Строка 10 - Можно использовать переменные без $ перед ними.
Строка 16 - Увеличение переменной на 1. Символ $ не нужен.
Строка 19 - Увеличение переменной на 3. Это краткая форма записи b = b + 3.
Строка 19 - В отличие от других способов символ * не нужно экранировать.
Двойные скобки дают довольно много свободы в форматировании кода.
Они доступны в Bash по умолчанию и их эффективность немного выше. Хотя заметить разницу на современных компьютерах будет непросто.
Сложение
Сложение в bash можно выполнить следущими способами
#!/bin/bash # Bash + # let A=2 B=3 let C=$A+ $B echo $C
#!/bin/bash # Bash + # expr and (( )) D=4 E=5 F=$( expr $D + $E ) G=$(( $D + $D )) echo $F echo $G
Целочисленное деление
В bash по умолчанию реализовано именно целочисленное деление
Рассмотрим, что будет если попытаться поделить числа с помощью let
#!/bin/bash # Целочисленное деление A=100 B=3 let "C = $A / $B " echo "C: $C "
Если вас это не устраивает - используйте bc
Остаток от деления
Остаток от деления можно получить с помощью % следующим оригинальным образом
Float Сложение
Сложение чисел с плавающей точкой можно выполнить с помощью bc
bc
В bash нет родной поддержки деления чисел с плавающей точкой. Но есть утилиты, которые умеют это делать.
Что будет если попытаться поделить числа с помощью let
#!/bin/bash # Деление с let A=100 B=3 let "C = $A / $B " echo "C: $C "
Чтобы этого не произошло используйте bc
bc: float умножение
Также с помощью bc удобно умножать числа с плавающей запятой
Sum of integer variables bash script
How can I do the sum of integers with bash script I read some variables with a for and I need to do the sum. I have written the code like this:
Very little needs to change. sum=$(( sum + number )) -- after changing your Read N and Sum=0 to read N and sum=0 .
4 Answers 4
Use the arithmetic command ((. )) :
#! /bin/bash read n sum=0 for ((i=1; i
#!/bin/bash echo "Enter number:" read N re='^4+$' if ! [[ $ =~ $ ]] then echo "Error. It's not a number" exit 1 fi Sum=0 for ((i=1;i <=N;i++)) do sum=$(($+ $)) done echo "$"
Well, not a straight bash solution, but you can also use seq and datamash (https://www.gnu.org/software/datamash/):
#!/bin/bash read N seq 1 $N | datamash sum 1
It is really simple (and it has its limitations), but it works. You can use other options on seq for increments different than 1 and so on.
It is also possible to declare a variable as an integer with declare -i . Any assignment to that variable is then evaluated as an arithmetic expression:
#!/bin/bash declare -i sum=0 read -p "Enter n: " n for ((i=1; i
See Bash Reference Manual for more information. Using arithmetic command ((. )) is preferred, see choroba's answer.
$ declare -i var1=1 $ var2=1 $ var1+=5 $ echo "$var1" 6 $ var2+=5 $ echo "$var2" 15
This can be a tad confusing as += behaves differently depending on the variable's attributes. It's therefore better to explicitly use ((. )) for arithmetic operations.