SHELL02 - 数值运算 条件测试 if选择结构

 一、数值运算

 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.34B=56.78

# echo “$A<=$B”  |  bc       //A是否小于或等于B

1

#echo “$A > $B”  |  bc         //A是否大于或等于B

0

 

二、条件测试

1. 测试操作概述

1shell 脚本的智能化

为命令的执行提供最直接的识别依据

文件或目录的读/写等状态

数值的大小

字符串是否匹配

多条件组合

2test测试操作

语法格式

- 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

 

  

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)语法格式及特点

条件成立时执行命令序列

否则,不执行任何操作

 

2if单分支的执行流程

流程示意图

 

3)脚本应用示例

任务目标

— 判断挂在点目录,若不存在则创建

 

2.  双分支结构

1)语法格式及特点

条件成立时执行命令序列1

否则,执行命令序列2

 

2if双分支的执行流程

流程示意图

 

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语句嵌套

针对多个条件分别执行不同的操作

 

2if多分枝的执行流程

执行流程示意图

 

3)脚本应用示例

任务目标

输入一个分数,判断成绩分挡

- 85100优秀、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

3 列出常见的整数值比较操作,并说明各自作用。
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双分支结构的执行流程。

猜你喜欢

转载自blog.csdn.net/qq_36441027/article/details/80071822