一、数值运算
1. 整数运算
1)基本运算类别
四则运算
+ - * /
* 取余数运算
- 求模 : num1 % num2
2) expr 运算工具
计算指定的表达式,并输出结果
- 格式: expr 整数1 运算符 整数2 。。。
- 乘法操作应采用\*转义,避免被作为shell通配符
3)$[ ] 算式替换
使用$[ ] 或 $(()) 表达式
- 格式: $[ 整数1 运算符 整数2 ... …]
- 乘法操作*无需转义,运算符两侧可以无空格
- 引用变量可省略$符号
- 计算结果替换表达式本身,可结合echo 命令输出
# X=43
# echo $[X+21]
# echo $((x-21)),$((x*21))
4)变量的自增/减等操作
使用$[ ],或者let命令来完成
- 结合echo 命令查看结果
# i=43
# echo $[i+=2]
# echo $[i-=8]
# let i++ ; echo $i
# let I-=7;echo $i
2. 小数运算
1) 整数运算的局限性
bash 内建机制仅支持整数值运算
- expr 命令、$[ ] 算式替换 不支持有小数的运算
# expr 123 + 45.678
# echo $[3.14*2]
2) 使用bc实现小数运算
多数linux系统默认安装此工具
- 支持高精度的数值运算
- 直接运行bc可进入交互式运算界面,quit退出
- 设置 scale=n 可约束小数位
# bc //打开bc计算器程序
12.34*56.78 //提交表达式
700.66
scale=4 //将可用的小数位增加为4
12.34*56.78 //重新计算表达式
700.6652
#quit //退出计算器
结合管道向bc 发送表达式
- 多个表达式以分号分隔
- 通过echo命令+管道传递要计算的表达式
# A=12.34
#echo “$A*56.789” | bc //单表达式
700.776
# echo “scale=4; $A*56.789;5/3 | bc //多表达式
700.7762
1.6666
3)小数值的比较
基本用法
- echo “数值1 比较符 数值2” | bc
- 如果表达式成立,则返回的计算结果为1,否则返回0
- 常见比较操作:>、>=、<、<=、==、!=
# A=12.34;B=56.78
# echo “$A<=$B” | bc //A是否小于或等于B
1
#echo “$A > $B” | bc //A是否大于或等于B
0
二、条件测试
1. 测试操作概述
1)shell 脚本的智能化
为命令的执行提供最直接的识别依据
- 文件或目录的读/写等状态
- 数值的大小
- 字符串是否匹配
- 多条件组合
2)test测试操作
语法格式
- test 选项 参数
- [ 选项 参数 ]
help test 查阅帮助
2. 常见的测试操作
1)字符串比较
[ 操作符 字符串]
-z 字符串的值为空
-n 字符串的值不为空(相当于!-z )
# [ -z “ ” ] && echo YES || echo NO
YES
# [ -z “ ” ] && echo YES || echo NO
NO
[ 字符串1 操作符 字符串2 ]
== 两个字符串相同
!= 两个字符串不相同
# [$USER == “root”] && echo “超级用户”
超级用户
#[$PWD!= “/”] && pwd
/root
2)整数值比较
[整数值1 操作符 整数值2]
检查已登录的用户数,是否不超过5个
# who | wc -l
2
#[$(who | wc -l)-le 5] && echo “ok”
ok
3)文件状态测试
[操作符 文件或目录]
文件状态测试
#[-d /etc/hosts]
#echo $?
1 //目录不存在,测试不成立
#[ -d /etc/vsftpd ]
#echo$?
1 //目录 /etc/vsftpd不存在,测试不成立
0 //目录 /etc/vsftpd存在,测试成立
#[ -d /etc/vsftpd ] && echo “YES”
YES
3. 组合多个条件
1)逻辑分隔操作
主要方法:
——命令1 操作符 命令2 ...
——[ 条件1 ] 操作符 [ 条件2 ] ...
[条件1] && 条件2 :只有条件1为真,才执行条件2
[条件1] | | [条件2]:只有条件1为假,才执行条件2
2)条件组合应用
当前用户是root,且位于/root目录下
#[ $USER == “root” ]&&[ $PWD == “/root” ]
#[ $? -eq 0 ]&&echo YES
YES
当/opt/testdir 目录不存在时,创建该目录
#[-d “/opt/testdir” ] || mkdir -p /opt/testdir
#ls -ld /opt/restdir
drwxr-xr-x 2 root root 4096 12-03 18:13 /opt/testdir/
三、if选择结构
1. 单分支结构
1)语法格式及特点
当“条件成立”时执行命令序列
否则,不执行任何操作
2)if单分支的执行流程
流程示意图
3)脚本应用示例
任务目标
— 判断挂在点目录,若不存在则创建
2. 双分支结构
1)语法格式及特点
当“条件成立”时执行命令序列1
否则,执行命令序列2
2)if双分支的执行流程
流程示意图
3)脚本应用示例
任务目标
- 检测并判断指定的主机是否可ping通
- 目标主机的地址以位置参数提供
# cat pinghost.sh
#!/bin/bash
ping -c 3 $1 &>/dev/null
if [ $? -eq 0 ];then
echo “Host $1 is up.”
else
echo “Host $1 is down.”
fi
3. 多分枝结构
1)语法格式及特点
相当于if语句嵌套
针对多个条件分别执行不同的操作
2)if多分枝的执行流程
执行流程示意图
3)脚本应用示例
任务目标
- 输入一个分数,判断成绩分挡
- 85~100优秀、70-84良好、低于70分、不及格
# cat gradediv.sh
#!/bin/bash
read -p “请输入分数(0-100):” FS
if[ $FS -ge 85 ] && [ $FS -le 100 ];then
echo “$FS分!优秀”
elif [$FS -ge 70 ] && [ $FS -le 84 ];then
echo “$FS分,合格”
else
echo“$FS分?不合格”
fi
练习:
1 执行 X=43 ; Y=21; echo $[X++],$[Y--] 操作的结果是多少?
43 21
2 计算根分区的磁盘使用率,百分比精确到2位小数。
[root@server0 ~]# df
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/vda1 10473900 3125180 7348720 30% /
devtmpfs 927072 0 927072 0% /dev
tmpfs 942660 80 942580 1% /dev/shm
tmpfs 942660 17044 925616 2% /run
tmpfs 942660 0 942660 0% /sys/fs/cgroup
[root@svr5 ~]# echo 'scale=3125180*100/10473900' | bc
[root@svr5 ~]# 29.85
expr: 参与运算的整数值与运算符之间需要以空格分开 *需要用 \*进行转义
$[] : 乘法(*)操作无需转义,运算符两侧可以无空格。引用变量可以省略$符号;计算结果替代表达式本身,可以结合echo命令输出
let : expr和$[]并不能改变变量的值,而let命令可以直接对变量值做运算再保存新的值
4 运用条件测试操作,检查当前的用户是否为root。
[root@server0 ~]# [ $USER == "root" ] && echo "Y" || echo "N"
[student@server0 root]$ [ $USER == "root" ] && echo "Y" || echo "N"
5 绘图描述if双分支结构的执行流程。