mirror of
https://github.com/LCTT/TranslateProject.git
synced 2024-12-26 21:30:55 +08:00
commit
c233af74cc
@ -1,223 +0,0 @@
|
||||
[#]: 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: "geekpi"
|
||||
[#]: 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/
|
@ -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: "geekpi"
|
||||
[#]: reviewer: " "
|
||||
[#]: publisher: " "
|
||||
[#]: url: " "
|
||||
|
||||
Bash 基础知识系列 #4:算术运算
|
||||
======
|
||||
|
||||
你可以使用 bash 脚本做很多事情。对变量执行简单的算术运算就是其中之一。
|
||||
|
||||
bash shell 中算术运算的语法如下:
|
||||
|
||||
```
|
||||
$((arithmetic_operation))
|
||||
```
|
||||
|
||||
假设你必须计算两个变量的总和。你这样做:
|
||||
|
||||
```
|
||||
sum=$(($num1 + $num2))
|
||||
```
|
||||
|
||||
(()) 内空格的使用没有限制。你可以使用 `$(( $num1+ $num2))`、`$(( $num1+ $num2 ))` 或者 `$(( $num1+ $num2 ))`。它们都一样。
|
||||
|
||||
在通过示例详细讨论之前,我先分享一下它支持的算术运算符。
|
||||
|
||||
### Bash 中的基本算术运算符
|
||||
|
||||
以下是 Bash shell 中算术运算符的列表。
|
||||
|
||||
| 运算符 | 描述 |
|
||||
| :- | :- |
|
||||
| + | 加法 |
|
||||
| - | 减法|
|
||||
| * | 乘法|
|
||||
| / | 整数除法(不带小数) |
|
||||
| % | 模除法(仅余数)|
|
||||
| ** | 求幂(a 的 b 次方)|
|
||||
|
||||
> 🚧 Bash 不支持浮点数(小数)。你必须使用其他命令(例如“bc”)来处理它们。
|
||||
|
||||
### bash 中的加法和减法
|
||||
|
||||
让我们通过编写一个脚本来看看它,该脚本从用户那里获取两个数字,然后打印它们的总和和减法。
|
||||
|
||||
```
|
||||
#!/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"
|
||||
```
|
||||
|
||||
我相信你熟悉上一章中使用 read 命令来[在 bash 中接受用户输入][1]。
|
||||
|
||||
你应该关注这两行:
|
||||
|
||||
```
|
||||
sum=$(($num1+$num2))
|
||||
sub=$(($num1-$num2))
|
||||
```
|
||||
|
||||
将此脚本保存为 `sum.sh` 并运行它。给它一些输入并检查结果。
|
||||
|
||||
![Example of addition and subtraction in Bash shell script][2]
|
||||
|
||||
### bash 中的乘法
|
||||
|
||||
现在让我们转向乘法。
|
||||
|
||||
这是一个将公里转换为米的示例脚本(这给美国读者带来了麻烦:D)。作为参考,1 公里等于 1000 米。
|
||||
|
||||
```
|
||||
#!/bin/bash
|
||||
|
||||
read -p "Enter distance in kilometers: " km
|
||||
meters=$(($km*1000))
|
||||
|
||||
echo "$km KM equals to $meters meters"
|
||||
```
|
||||
|
||||
将脚本保存为 `multi.sh`,赋予其执行权限并运行它。这是一个示例输出:
|
||||
|
||||
![Multiplication in bash script][3]
|
||||
|
||||
看起来不错,不是吗? 让我们继续进行除法。
|
||||
|
||||
### bash 脚本中的除法
|
||||
|
||||
让我们用一个非常简单的脚本来看看除法:
|
||||
|
||||
```
|
||||
#!/bin/bash
|
||||
|
||||
num1=50
|
||||
num2=5
|
||||
|
||||
result=$(($num1/$num2))
|
||||
|
||||
echo "The result is $result"
|
||||
```
|
||||
|
||||
你很容易猜到结果:
|
||||
|
||||
```
|
||||
The result is 10
|
||||
```
|
||||
|
||||
没关系。但是让我们更改数字并尝试将 50 除以 6。结果如下:
|
||||
|
||||
```
|
||||
The result is 8
|
||||
```
|
||||
|
||||
**但这不正确。** 正确答案应该是 8.33333。
|
||||
|
||||
这是因为 bash 默认情况下只处理整数。你需要额外的命令行工具来处理浮点(小数)。
|
||||
|
||||
最流行的工具是[bc][4],它是一种处理数学运算的非常强大的计算器语言。不过,你现在不需要关注细节。
|
||||
|
||||
你必须通过管道将算术运算“回显”给 bc:
|
||||
|
||||
```
|
||||
echo "$num1/$num2" | bc -l
|
||||
```
|
||||
|
||||
于是,将之前的脚本修改为:
|
||||
|
||||
```
|
||||
#!/bin/bash
|
||||
|
||||
num1=50
|
||||
num2=6
|
||||
|
||||
result=$(echo "$num1/$num2" | bc -l)
|
||||
|
||||
echo "The result is $result"
|
||||
```
|
||||
|
||||
现在你得到结果:
|
||||
|
||||
```
|
||||
The result is 8.33333333333333333333
|
||||
```
|
||||
|
||||
请注意 `result=$(echo "$num1/$num2" | bc -l)`,它现在使用你在[本系列第 2 章][5]中看到的命令替换。
|
||||
|
||||
`-l` 选项加载标准数学库。默认情况下,bc 最多保留 20 位小数。你可以通过以下方式将比例更改为较小的值:
|
||||
|
||||
```
|
||||
result=$(echo "scale=3; $num1/$num2" | bc -l)
|
||||
```
|
||||
|
||||
让我们看看 bash 中浮点的更多示例。
|
||||
|
||||
### 在 bash 脚本中处理浮点
|
||||
|
||||
让我们修改 `sum.sh` 脚本来处理浮点。
|
||||
|
||||
```
|
||||
#!/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"
|
||||
```
|
||||
|
||||
现在尝试运行它,看看是否可以正确处理浮点:
|
||||
|
||||
![Floating points in bash script][6]
|
||||
|
||||
### 🏋️🤸 练习时间
|
||||
|
||||
是时候一起做一些数学和 bash 练习了。
|
||||
|
||||
**练习 1**:创建一个脚本,接受以 GB 为单位的输入并以 MB 和 KB 为单位输出其等效值。
|
||||
|
||||
**练习 2**:编写一个带有两个参数并以指数格式输出结果的脚本。
|
||||
|
||||
因此,如果输入 2 和 3,输出将为 8,即 2 的 3 次方。
|
||||
|
||||
**提示**:使用幂运算符**
|
||||
|
||||
**练习 3**:编写一个将摄氏度转换为华氏度的脚本。
|
||||
|
||||
**提示**:使用公式 F = C x (9/5) + 32。你必须在此处使用 `bc` 命令。
|
||||
|
||||
你可以在社区中讨论练习及其方案。
|
||||
|
||||
在下一章中,你将[了解 Bash 中的数组][7]。敬请关注。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/bash-arithmetic-operation/
|
||||
|
||||
作者:[Abhishek Prakash][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[校对者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/
|
Loading…
Reference in New Issue
Block a user