Linux中的算术运算

快捷查看指令 ctrl+f 进行搜索会直接定位到需要的知识点和命令讲解(如有不正确的地方欢迎各位小伙伴在评论区提意见,博主会及时修改)

算术运算

算数运算符
+ - 加法减法
* / % 乘法 取商 取模(取余)  例如:5除以2 商是2 余数()是 1 5/2-----2 5%2-----1
** 幂运算 例如:5的2次方 5**2------25 5的3次方 5**3------125
++ -- 操作数自身增加或者减少1 例如: a++ ++a
&& || ! 逻辑与 逻辑或 取反
< > <= >= == =(对于字符串也相当于比较) != 小于 大于 小于等于 大于等于 等于 不等于
= += -= *= /= %= 赋值运算符 num=1 num+=1 num*=3
算数运算指令
(()) 	经常用于整数运算 效率很高
let 	用于整数运算 等同于 (())
expr 	可用于整数运算,还有其他额外功能
bc [需要先安装] Linux下的一个计算器程序(适合整数以及小数运算)
$[] 	用于整数运算
算数运算符与算数运算指令
((i=i+1)) 运算后赋值。将 i+1 的运算结果赋值给变量 i 若要打印 echo $((i=i+1))
i=$((i+1)) 将表达式运算后的结果赋值给 i
((8>7&&5==5)) 可以进行比较操作 还可以加入逻辑与 逻辑或 经常用于条件判断
echo $((2+1)) 打印输出运算表达式的结果 需要在 (())前添加 $
案例:
## 1.有关逻辑运算 真(1) 假(0)
[root@bai ~]# echo $((8>7))
1
[root@bai ~]# echo $((6>7))
0
## 2. 逻辑运算符的演示 && || !
[root@bai ~]# echo $((6>7&&3>4))
0
[root@bai ~]# echo $((6>7||3<4))
1
[root@bai ~]# echo $((7>6&&5>4))
1
[root@bai ~]# echo $[!((id))] #i=1;a=2;b=3;d=4
0
## 3.算数运算
[root@bai ~]# echo $((3+4))  # 加法
7
[root@bai ~]# echo $((3-4))  # 减法
-1
[root@bai ~]# echo $((3*4))  # 乘法
12
[root@bai ~]# echo $((4/3))  # 取商(取整)
1
[root@bai ~]# echo $((4%3))  # 取模(取余)
1
## 4. 幂运算
[root@bai ~]# echo $((5**2))
25
[root@bai ~]# echo $((5**3))
125
## 5. 给变量赋值
[root@bai ~]# num=100
[root@bai ~]# ((num=num*3))
[root@bai ~]# echo $num
300
## 6. 小数运算
[root@bai ~]# ((c=1+100+2**3+1.2))
-bash: ((: c=1+100+2**3+1.2: 语法错误: 无效的算术运算符 (错误符号是 ".2")
注意:
(()) 只能对整数进行运算 -----> 小数运算需要使用 bc
## 7.特殊符号运算
++ 变量自增1
-- 变量自减1
a++ 先对变量a操作,然后再让a自增1
++a 先让a自增1,然后再复制给
[root@bai ~]# a=5
[root@bai ~]# echo $((++a))
6
[root@bai ~]# echo $a
6
[root@bai ~]# b=5
[root@baizhi ~]# echo $((b++))
5
[root@baizhi ~]# echo $b
6
[root@bai ~]# c=5
[root@bai ~]# echo $((c--))
5
[root@bai ~]# echo $c
4
[root@bai ~]# d=5
[root@bai ~]# echo $((--d))
4
[root@bai ~]# echo $d
4
let的使用
## let 对变量的数值运算
[root@bai ~]# num=5
[root@bai ~]# let num=num+4
[root@bai ~]# echo $num
9
[root@bai ~]# let num+=1.2
-bash: let: num+=1.2: 语法错误: 无效的算术运算符 (错误符号是 ".2"
expr
## expr命令不太好用,基于空格传入参数 但是在shell中一些字符具备特殊含义
[root@bai ~]# expr 5+3
5+3
[root@bai ~]# expr 5 + 3
8
[root@bai ~]# expr 5 * 3
expr: 语法错误
[root@bai ~]# expr 5 \* 3
15
[root@bai ~]# expr 5 \> 6
0
[root@bai ~]# expr 8 \> 6
1
## 注意 : 数值与运算符号之间需要加空格 运算符很容易识别失败 需要转义
expr内置函数
length函数
## 案例
[root@bai ~]# expr length 123456789
9
[root@bai ~]# size="123456789"
[root@bai ~]# expr length $size
9
[root@bai ~]# size="123456789 " 
[root@bai ~]# expr length $size # 空格也算字符
9
expr模式匹配
expr指令支持模式匹配功能
两个特殊符号
: 冒号用于计算字符串的字符数量 gaosc 5个字符
.* 任意的字符串重复0次或多次
最后的模式 支持自定义
## 语法
expr 字符串 ":" ".*"
案例:
## 根据指定的字符获取 包括字符在内 字符及字符之前的 数量
[root@bai ~]# expr test.jpg ":" ".*"
8
[root@bai ~]# expr test.jpg ":" ".*j"
6
[root@bai ~]# expr test.jpg ":" ".*p"
7
[root@bai ~]# expr yc.png ":" ".*\.png"
6
[root@bai ~]# expr yc.png ":" ".*\.jpg"
0
[root@bai ~]# expr yc.jptg ":" ".*\.jpg"
0
[root@bai ~]# expr yc.jpggggggggggggggggggg ":" ".*\.jpg"
6
bc指令
# 1. 安装 bc 软件
yum -y install bc
# 2.使用计算器
bc
bc命令结合管道符来计算
案例1:
[root@bai ~]# echo "4*4"
4*4
[root@bai ~]# echo "4*4" | bc
16
[root@bai ~]# echo "4.2*4" | bc
16.8
[root@bai ~]# num=5
[root@bai ~]# echo $num*1.2 | bc
6.0
[root@bai ~]# result=`echo $num*1.2 | bc`
[root@bai ~]# echo $result
6.0
案例2:
## 计算1~1000的和
数学公式
1+2+3+4+5+6+...+999+1000
方法1:
## 1.先想办法获取这些操作数
[root@bai ~]# echo {1..1000}
## 2.将数字之间的空格替换为 +
[root@bai ~]# echo {1..1000} | tr " " "+"
## 3.将上一步处理以后的字符串交给 bc 进行运算
[root@bai ~]# echo {1..1000} | tr " " "+" | bc
500500
方法2:
[root@bai ~]# seq -s "+" 1000 | bc
500500
方法3:
[root@bai ~]# echo $((`seq -s "+" 1000`))
500500
###补充
seq 数字 # 打印1 2 3 4 5 ... 数字 数字之间分隔符默认为换行
seq -s 数字连接符 数字 # 指定连接符连接 1 2 3 4.... 数字
### 例如
seq -s "+" 10
输出 1+2+3+4+5+6+7+8+9+10
方法4:
[root@bai ~]# seq -s " + " 1000 | xargs expr
500500
read指令
可以在程序运行过程中,程序员输入数据
## 从标准输入中读取数据并赋值给指定变量
# 语法 read 变量名
[root@bai ~]# read var
123 # 借助键盘标注输入设备,录入数据以后 保存在 var变量中
[root@bai ~]# echo $var
123
## 从标准输入中输入多个值(用空格间隔),回车输入结束 第一个值给变量1 后续所有的值给变量2
## 语法 read 变量1 变量2
[root@bai ~]# read first last
123 456 789 000 111 222
[root@bai ~]# echo $first
123 # first保存第一个值
[root@bai ~]# echo $last
456 789 000 111 222 # 其余的值存入 last变量中
[root@bai ~]# read a b c # a b两个变量中各存一个值 其余赋值给 c
123 456 789 123
[root@bai ~]# echo $a
123
[root@bai ~]# echo $b
456
[root@bai ~]# echo $c
789 123

## 若read后未指定变量名,则数据赋值给变量 REPLY
[root@bai ~]# read
123
[root@bai ~]# echo $REPLY
123

## 把多个值存入一个变量中
语法:
read -a 变量
[root@bai ~]# read -a array
123 456 789 456 789 123 000
[root@bai ~]# echo ${array[0]}
123
[root@bai ~]# echo ${array[6]}
000
[root@bai ~]# echo ${array[@]}
123 456 789 456 789 123 000

## 限定输入读取的时长
语法:
	read -t 时间 变量
## 测试数据
read.sh
#!/bin/bash
echo "请在五秒内完成密码录入并回车,请输入密码:"
read -t 5 passwd ## 在5秒内完成信息录入并回车 否则数据不会保存
echo "--------------------------"
echo "您输入的密码为:"$passwd
## 操作界面
[root@bai bai]# ./read.sh
请在五秒内完成密码录入并回车,请输入密码:
123456
--------------------------
您输入的密码为:123456

## 允许输入反斜杠
语法:
	read -r 变量名
[root@bai bai]# read var
123 \
>
[root@bai bai]# read -r var
123 \ 123 \ 123


## 默认是 回车键代表结束输入
read -d "符号" 变量名
[root@bai bai]# read -d ":" var
123 :[root@bai bai]# read -d ":" var
123
## 此时回车结束符被 冒号 覆盖

## 从标准输入中读取两个字符 并存入变量 不需要按回车读取结束
语法:
read -n 2 变量名
[root@bai bai]# read -n 2 var
12

你可能感兴趣的:(Linux,linux)