Merge pull request #29693 from lkxed/20230703-0-Bash-Basics-Series-4-Arithmetic-Operations

[手动选题][tech]: 20230703.0 ️ Bash Basics Series 4 Arithmetic Operations.md
This commit is contained in:
Xingyu.Wang 2023-07-11 16:41:54 +08:00 committed by GitHub
commit fe78eb406e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -0,0 +1,223 @@
[#]: subject: "Bash Basics Series #4: Arithmetic Operations"
[#]: via: "https://itsfoss.com/bash-arithmetic-operation/"
[#]: author: "Abhishek Prakash https://itsfoss.com/author/abhishek/"
[#]: collector: "lkxed"
[#]: translator: " "
[#]: reviewer: " "
[#]: publisher: " "
[#]: url: " "
Bash Basics Series #4: Arithmetic Operations
======
You can do a lot of things with bash scripts. Performing simple arithmetic operations with the variables is one of them.
The syntax for arithmetic operations in the bash shell is this:
```
$((arithmetic_operation))
```
Let's say you have to calculate the sum of two variables. You do it like this:
```
sum=$(($num1 + $num2))
```
There is no restriction on the use of white space inside the (()). You can use `$(( $num1+ $num2))`, `$(( $num1+ $num2 ))` or `$(( $num1+ $num2 ))`. It all will work the same.
Before I discuss it in detail with examples, let me share the arithmetic operators it supports.
### Basic arithmetic operators in Bash
Here's a list of the arithmetic operators in the Bash shell.
| Operator | Description |
| :- | :- |
| + | Addition |
| - | Subtraction |
| * | Multiplication |
| / | Integer division (without decimal) |
| % | Modulus division (only remainder) |
| ** | Exponentiation (a to the power b) |
> 🚧 Bash does not support floating points (decimals). You'll have to use other commands like`bc`to deal with them.
### Addition and subtraction in bash
Let's see it by writing a script that takes two numbers from the user and then prints their sum and subtraction.
```
#!/bin/bash
read -p "Enter first number: " num1
read -p "Enter second number: " num2
sum=$(($num1+$num2))
sub=$(($num1-$num2))
echo "The summation of $num1 and $num2 is $sum"
echo "The substraction of $num2 from $num1 is $sub"
```
I believe you are familiar with using the read command to [accept user input in bash][1] from the previous chapter.
You should focus on these two lines:
```
sum=$(($num1+$num2))
sub=$(($num1-$num2))
```
Save this script as `sum.sh` and run it. Give it some inputs and check the result.
![Example of addition and subtraction in Bash shell script][2]
### Multiplication in bash
Let's move to multiplication now.
Here's a sample script that converts kilometers into meters (and troubles US readers :D). For reference, 1 kilometer is equal to 1000 meters.
```
#!/bin/bash
read -p "Enter distance in kilometers: " km
meters=$(($km*1000))
echo "$km KM equals to $meters meters"
```
Save the script as `multi.sh`, give it execute permission and run it. Here's a sample output:
![Multiplication in bash script][3]
Looks good, no? Let's move on to division.
### Division in bash scripts
Let's see division with a very simple script:
```
#!/bin/bash
num1=50
num2=5
result=$(($num1/$num2))
echo "The result is $result"
```
You can easily guess the result:
```
The result is 10
```
That's fine. But let's change the numbers and try to divide 50 by 6. Here's what it shows as result:
```
The result is 8
```
**But that's not correct.** The correct answer should be 8.33333.
That's because bash only deals with integers by default. You need additional CLI tools to handle floating points (decimals).
The most popular tool is [bc][4] which is quite a powerful calculator language to deal with mathematical operations. However, you don't need to go into detail for now.
You have to 'echo' the arithmetic operation to bc via pipe:
```
echo "$num1/$num2" | bc -l
```
So, the previous script is modified into:
```
#!/bin/bash
num1=50
num2=6
result=$(echo "$num1/$num2" | bc -l)
echo "The result is $result"
```
And now you get the result:
```
The result is 8.33333333333333333333
```
Notice the `result=$(echo "$num1/$num2" | bc -l)`, it now uses the command substitution that you saw in [chapter 2 of this series][5].
The `-l` option loads standard math library. By default, bc will go up to 20 decimal points. You can change the scale to something smaller in this way:
```
result=$(echo "scale=3; $num1/$num2" | bc -l)
```
Let's see some more examples of floating points in bash.
### Handling floating points in bash scripts
Let's modify the `sum.sh` script to handle floating points.
```
#!/bin/bash
read -p "Enter first number: " num1
read -p "Enter second number: " num2
sum=$( echo "$num1+$num2" | bc -l)
sub=$( echo "scale=2; $num1-$num2" | bc -l)
echo "The summation of $num1 and $num2 is $sum"
echo "The substraction of $num2 from $num1 is $sub"
```
Try running it now and see if handles floating points properly or not:
![Floating points in bash script][6]
### 🏋️🤸 Exercise time
Time to do some maths and bash exercises together.
**Exercise 1**: Create a script that accepts input in GB and outputs its equivalent value in MB and KB.
**Exercise 2**: Write a script that takes two arguments and outputs the result in exponential format.
So, if you enter 2 and 3, the output will be 8, which is 2 to the power 3.
**Hint**: Use the exponentiation operator **
**Exercise 3**: Write a script that converts Centigrade to Fahrenheit.
**Hint**: Use the formula F = C x (9/5) + 32. You'll have to use `bc` command here.
You can discuss the exercises and their solution in the community.
In the next chapter, you'll [learn about arrays in Bash][7]. Stay tuned.
--------------------------------------------------------------------------------
via: https://itsfoss.com/bash-arithmetic-operation/
作者:[Abhishek Prakash][a]
选题:[lkxed][b]
译者:[译者ID](https://github.com/译者ID)
校对:[校对者ID](https://github.com/校对者ID)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://itsfoss.com/author/abhishek/
[b]: https://github.com/lkxed/
[1]: https://itsfoss.com/bash-pass-arguments/
[2]: https://itsfoss.com/content/images/2023/07/addition-substraction-bash-script.png
[3]: https://itsfoss.com/content/images/2023/07/multiplication-bash-script.png
[4]: https://www.gnu.org/software/bc/manual/html_mono/bc.html
[5]: https://itsfoss.com/bash-use-variables/
[6]: https://itsfoss.com/content/images/2023/07/floating-point-bash.png
[7]: https://itsfoss.com/bash-arrays/