Shell数值运算 & 条件测试 & if选择结构

一 . 数值运算

–使用expr $[ ] let等整数运算工具
–使用bc实现小数运算

1.1 使用expr命令

—乘法操作应 采用 * 转义 避免 * 被作为shell通配符 运算符两边必须要有空格分开 引用变量时必须加 $ 符号

[root@shell ~]# w=123 #自定义变量
[root@shell ~]# expr $w + 45 #加
168
[root@shell ~]# expr $w - 45 #减
78
[root@shell ~]# expr $w * 45 #乘 需要添加 \ 转义
5535
[root@shell ~]# expr $w / 45 #除
2

1.2 使用$[ ] 或 $(())表达式

—乘法操作 * 无需转义 运算符两侧可以无空格 引用变量可省略 $ 符号 计算结果替换表达式本身 可结合echo命令输出

[root@shell ~]# expr $[a+54]
165
[root@shell ~]# expr $[a*54]
5994

1.3 使用let命令

—expr或$[ ] $(())方式只进行运算 并不改变变量的值 而let命令可以直接对变量值做运算再保存新的值 在执行let运算后的值会变更 let运算操作并不显示结果 可以结合echo命令来查看

[root@shell ~]# let c=b-a;echo $c
1
[root@shell ~]# let c=b/a;echo $c
2

1.4 计算的简写
在这里插入图片描述

2.1 小数运算工具

小数位的长度可采用scale=N限制 除此以外也受参与运算的数值的小数位影响

2.1.1 bc交互式运算

[root@shell ~]# bc
12.35+62.264
74.614
quit

2.1.2 bc非交互式运算

——将需要运算的表达式通过管道操作交给bc运算

[root@shell ~]# echo ‘scale=4;1.265*5.21’ | bc
6.5906

二 . 条件测试

2.1 Shell脚本的智能化

为命令的执行提供最直接的识别依据
-文件或目录的读/写等状态
-数值的大小
-字符串是否匹配
-多条件的组合

2.2 条件测试基本用法

–使用 “test 表达式 ” 或者 [表达式] 都可以 表达式两边至少要留一个空格
–条件测试操作本身不显示出任何信息 测试的条件是否成立主要体现在命令执行后的返回状态 即$ ?
–可以在测试后查看变量$?的值来做出判断 或者结合&& ||等逻辑操作显示出结果(或作其他操作)

三 . 字符串测试

3.1 ==比较两个字符串是否相同

[root@shell ~]# [ $USER == root ]
[root@shell ~]# echo $?
0 #检查当前用户是否为root 0为对 非0为错

3.2 != 比较两个字符串是否不相同

[root@shell ~]# [ $USER != root ]
[root@shell ~]# echo $?
1

3.3 -z 检查变量的值是否未设置(空值)

[root@shell ~]# dan=“keai” ; daner=""
[root@shell ~]# [ -z “$ dan” ] && echo “空值” || echo “非空值”
非空值
[root@shell ~]# [ -z “$daner” ] && echo “空值” || echo “非空值”
空值
[root@shell ~]# [ ! -z $dan ]

补充:-n可以测试变量是否不为空 (相当于!-z)

3.4 逻辑与 逻辑或
在这里插入图片描述

四 . 整数值比较

参与比较的必须是整数(可以调用变量) 比较非整数值时会出错

4.1 -eq 等于 比较两个数是否相等

[root@shell ~]# d=12
[root@shell ~]# [ $d -eq 12 ] && echo “相等” || echo “不相等”
相等
[root@shell ~]# [ $d -eq 39 ] && echo “相等” || echo “不相等”
不相等

4.2 -ne 不等于 比较两个数是否不相等

[root@shell ~]# q=12
[root@shell ~]# [ $q -ne 12 ] && echo “不等于” || echo “等于”
等于
[root@shell ~]# [ $q -ne 46 ] && echo “不等于” || echo “等于”
不等于

4.3 -gt 大于 比较前面的整数是否大于后面的整数

[root@shell ~]# q=12
[root@shell ~]# [ $q -gt 19 ] && echo “大于” || echo “不大于”
不大于
[root@shell ~]# [ $q -gt 10 ] && echo “大于” || echo “不大于”
大于

4.4 -ge 大于等于 比较前面的整数是否大于或等于后面的整数

[root@shell ~]# q=12
[root@shell ~]# [ $q -ge 10 ] && echo “大于或等于” || echo “否”
大于或等于
[root@shell ~]# [ $q -ge 49 ] && echo “大于或等于” || echo “否”

4.5 -lt 小于 比较前面的整数是否小于后面的整数

[root@shell ~]# a=11
[root@shell ~]# [ $q -lt 10 ] && echo “小于” || echo “否”

[root@shell ~]# [ $q -lt 789 ] && echo “小于” || echo “否”
小于

4.6 -le 小于等于 比较前面的整数是否小于等于后面的整数

[root@shell ~]# q=11
[root@shell ~]# [ $q -le 45 ] && echo “小于或等于” || echo “否”
小于或等于
[root@shell ~]# [ $q -le 9 ] && echo “小于或等于” || echo “否”

[root@shell ~]# [ $q -le 11 ] && echo “小于或等于” || echo “否”
小于或等于

小案例 : 判断当前登录的用户 超过2个则发邮件报警

[root@shell ~]# cat baojing.sh
#!/bin/bash
echo “用户数已经超过3个” > mail.txt
[ $(who | wc -l ) -gt 3 ] && mail -s “警报” root < /root/mail.txt

五 . 识别文件/目录的状态

5.1 -e 判断对象是否存在 (不管是目录还是文件)

[root@shell ~]# [ -e “/etc/fstab” ] && echo “存在” || echo “不存在”
存在
[root@shell ~]# [ -e “/etc/dandan” ] && echo “存在” || echo “不存在”
不存在

5.2 -d判断对象是否为目录(存在且是目录)

[root@shell ~]# [ -d “/etc/fstab” ] && echo “是目录” || echo “不是目录”
不是目录
[root@shell ~]# [ -d “/etc/” ] && echo “是目录” || echo “不是目录”
是目录

5.3 -f 判断对象是否为文件(存在且是文件)

[root@shell ~]# [ -f “/usr/” ] && echo “是文件” || echo “不是文件”
不是文件
[root@shell ~]# [ -f “/etc/fstab” ] && echo “是文件” || echo “不是文件”
是文件

5.4 -r 判断是否可读

[root@shell ~]# cp /etc/hosts /tmp/test.txt
[root@shell ~]# chmod -r /tmp/test.txt #去除掉所有权限
[root@shell ~]# [ -r “/tmp/test.txt” ] && echo “可读” || echo “不可读”
可读
[root@shell ~]# su - dan
[dan@shell ~]$ [ -r “/tmp/test.txt” ] && echo “可读” || echo “不可读”
不可读

5.5 -w 判断对象是否可写

对root无效 无论文件是否设置 w 权限 root都可写

[root@shell ~]# chmod -w dan.sh
[root@shell ~]# ls -l dan.sh
-r-xr-xr-x. 1 root root 31 3月 29 15:41 dan.sh
[root@shell ~]# [ -w “dan.sh” ] && echo “可写” || echo “不可写”
可写

切换到普通用户 正常使用 - w 测试

[root@shell ~]# su - dan
[dan@shell ~]$ [ -w “dan.sh” ] && echo “可写” || echo “不可写”
不可写

5.6 -x 判断对象是否具有执行权限

[root@shell ~]# chmod 644 dan.sh #重新设置权限 没有x
[root@shell ~]# ls -l dan.sh
-rw-r–r--. 1 root root 31 3月 29 15:41 dan.sh
[root@shell ~]# [ -x “dan.sh” ] && echo “可以执行” || echo “不可执行”
不可执行
[root@shell ~]# chmod +x dan.sh #添加x权限
[root@shell ~]# [ -x “dan.sh” ] && echo “可以执行” || echo “不可执行”
可以执行

六 . 多个条件/操作的逻辑组合

6.1 && 逻辑与

给定条件必须都成立 整个测试结果才为真

[root@shell ~]# a=12
[root@shell ~]# [ $a -gt 10 ] && [ $a -lt 58 ] && echo “YES”
YES

6.2 || 逻辑或

只要其中一个条件成立 整个测试结果为真

[root@shell ~]# [ -w “/etc” ] || [ -w “/var/dan” ] && echo “ok”
ok #只要/etc 或者 /var/dan 目录中有一个可写 则为ok

七 . 使用if结构

7.1 if 单分支语法组成
在这里插入图片描述

案例 : 检测 /dan/kyrie 目录是否存在 不存在则创建

[root@shell ~]# cat catalog.sh
#!/bin/bash
dir="/dan/kyrie"
if [ ! -d $dir ]
then
mkdir -p $dir
fi
[root@shell ~]# chmod +x catalog.sh
[root@shell ~]# ./catalog.sh
[root@shell ~]# ls -ld /dan/kyrie/

7.2 if 双分支语法组成
在这里插入图片描述

案例 : 检测并判断指定主机是否可以ping通

用 $? 的返回状态值来判断ping目标主机的成功与否
(-c 3)只发送3个测试包 (-i 0.2)缩短发送测试的见个秒数 (-W 1)等待反馈的超时秒数

[root@shell ~]# cat ping.sh
#!/bin/bash
ping -c 3 -i 0.2 -W 1 $1 &> /dev/null
if [ $? -eq 0 ] ; then
echo “ip $1 is up”
else
echo “ip $1 is down”
fi
[root@shell ~]# ./ping.sh 192.168.4.10
ip 192.168.4.10 is up
[root@shell ~]# ./ping.sh 192.168.4.5
ip 192.168.4.5 is down

7.3 if 多分支语法组成
在这里插入图片描述
案例 : 读取成绩分数 给出对应评价

[root@shell ~]# cat grade.sh
#!/bin/bash
read -p “请输入您的分数:” FS
if [ $ FS -ge 90 ] ; then
echo “$ FS分,棒极了”
elif [ $ FS -ge 80 ] ; then
echo “$ FS分,优秀”
elif [ $ FS -ge 70 ] ; then
echo “$ FS分,加把劲”
elif [ $ FS -ge 60 ] ; then
echo “$ FS分,需要努力”
else
echo “$FS分,不合格”
fi
[root@shell ~]# chmod +x grade.sh
[root@shell ~]# ./grade.sh
请输入您的分数:96
96分,棒极了

猜你喜欢

转载自blog.csdn.net/Kyrie__/article/details/88914804