当前位置:首页 > 有云笔记 > Shell > 正文内容

条件测试 、 if选择结构 、 循环结构

小白3年前 (2022-01-04)Shell106490

条件测试 、 if选择结构 、 循环结构

=============================================

一,运算  

1 expr  运算并输出结果

2 $[   ]或者$((  ))   运算 ,如果要直接看

结果,可以配合echo命令

echo $[1+1]

echo $[2-1]

echo $[2*2]

echo $[4/2]

echo $[4%2]

a=10

b=20

echo $[a+b]

3 let

或者变量的自增减

let a=1+1   //创建变量

变量的自增减:

常规写法       主流写法

let a=a+1       let a++     变量a加1

let a=a-1       let a--      变量a减1

let a=a+10      let a+=10   变量a加10

let a=a-10      let a-=10    变量a减10

let a=a*2       let a*=2     变量a乘以2

let a=a/2       let a/=2    变量a除以2

let a=a%3      let a%=3    变量a除以3取余数

 

4 bc

echo "10/3" | bc

echo "scale=2;10/3" | bc      //scale可以定义结果是小数点后多少位

---------------------------------------------------

二,条件测试,可以赋予脚本智能判断的效果

语法格式 1,  test  表达式   2, [  表达式  ]

1,对字符串进行测试

== 两边是否相等,相等时条件测试算成功

!= 两边是否不等,不相等时条件测试算成功

test a == a  //方式一:test ,使用常量判断,再用echo $?测试结果

test a == b  

[ a == a ]   //方式二:中括号,使用常量判断,再用echo $?测试结果

[ a == b ]   

a=abc

a=xyz

[ $a == $b ]  //使用变量判断两个变量的值是否相等

[ $a != $b ]   //使用变量判断两个变量的值是否不相等

[ "$c" == $b ]  //如果变量为空,有可能报错,加双引号可以避免

-z 

[ -z $a ]  //判断变量是否为空,为空时条件测试算成功

[ ! -z $a ]  //判断变量是否非空,非空时条件测试算成功

 

2,逻辑组合

&&  指令     条件成功才执行指令      

||   指令     条件失败才执行指令

[  root  ==  $USER  ] || exit   //判断当前用户名是否为root

如果判断失败,则执行exit

[  $USER  !=  root  ] && exit  //判断当前用户名是否不为root

如果判断成功,则执行exit

------------------------------------------------------------

当多个逻辑符号组合使用时

A && B    AB都成功才算成功

A || B     AB 任务有一个成功算成功

 

touch a b c

ls a  &&  ls b  &&  ls c     //结果是都显示

ls a  ||  ls b  ||  ls c      //结果是显示a 

ls a  &&  ls b  ||  ls c     //结果是显示ab

ls a  ||  ls b  &&  ls c     //结果是显示ac

[ root != $USER ]  &&  echo "非管理员不能执行该脚本"  && exit  //之前

的语句可以改进成这个方式

3,数字

-eq  是否相等    -ne  是否不等    -gt  是否大于

-ge   是否大于等于  -lt  是否小于   -le  是否小于等于

----------------------------------

-eq Equal

-ne Not Equal

-ge Greater or Equal

-le Less or Equal

-gt Greater Than

-lt Less Than

----------------------------------

编写脚本,每2分钟检查服务器的用户数量,如果发生变化

则发邮件通知管理员

编写脚本前 echo "测试" | mail -s test root   测试下邮件功能是否正常 

yum -y install  mailx  sendmail    //如果不正常就安装软件包

systemctl start sendmail    //然后启动服务


#!/bin/bash

x=$(cat /etc/passwd | wc -l)   //将目前用户数量赋值给变量x

[ $x -gt 29 ] && echo "用户数量发生变化,服务器可能被入  

" | mail -s test root       //如果目前用户数量大于29,就

发邮件给管理员,29是之前查看的用户数量


chmod  u+x  test01.sh   //然后给脚本加x权限

crontab  -e     //编写计划任务

*/2 * * * * /opt/test01.sh    //定义每2分钟执行脚本

-------------------------------------

4, 文件

-e  判断文件是否存在,不关心类型

-f  判断文件是否存在,必须是普通文件

-d  判断文件是否存在,必须是目录

-r  判断当前用户对文件是否有读权限,对root无效

-判断当前用户对文件是否有写权限,对root无效

-x  判断当前用户对文件是否有x权限

[ -e abc ]   //判断当前目录下的abc是否存在,用echo $?查结果

[ -f /opt/abc ]   //判断opt下有没有abc这个普通文件

[ -d /opt/abc ]  //判断opt下有没有abc这个目录

mkdir  xyz

[ -d /opt/xyz ]   //判断opt下有没有xyz这个目录

[ -r /opt/abc ]   //判断当前用户对abc是否有读权限

[ -w /opt/abc ]   //判断当前用户对abc是否有写权限

[ -x /opt/abc ]   //判断当前用户对abc是否有x权限

---------------------------------------------------------------------

==  !=  -z   ! -z

&&        ||

-eq  -ne  -gt  -ge   -lt  -le

-e  -f  -d  -r  -w  -x

---------------------------------------

if分支

1, 单分支

if 条件测试;then    //满足条件的话就执行下面指令

执行指令

fi

 

#!/bin/bash

if [ $UID -eq 0 ];then

echo "我是管理员"

echo ok

fi

2, 双分支

if 条件测试;then    //满足条件的话就执行下面指令

执行指令A   //指令可以是一条,也可以是多条

else     //否则,不满足条件的话就执行下面指令

执行指令B

fi

 

#!/bin/bash

if [ $UID -eq 0 ];then

echo "我是管理员"

echo ok

else

echo "我不是管理员"

echo no

fi

------------------------------------------------

ping  -c  3  -i  0.2  -W  1  192.168.2.254

// -c 定义ping的次数   -i 定义ping的间隔时间()

-W  ping失败时多久反馈结果

-------------------------------------------------

使用if双分支编写ping脚本

#!/bin/bash

ping -c 3 -i 0.2 -W 1 $1 &> /dev/null   //使用$1位置变量

更方便

if [ $? -eq 0 ];then

echo "通了!"

else

echo "不通!"

fi

3,多分支

if 条件测试;then    //满足条件的话就执行下面A指令

执行指令A   //指令可以是一条,也可以是多条

elif 条件测试;then    //满足条件的话就执行下面B指令

执行指令B

elif 条件测试;then    //满足条件的话就执行下面C指令

执行指令C

else     //否则,不满足条件的话就执行下面指令

执行指令

fi

 

#!/bin/bash

read -p "提示信息:"  x

if [ $x -ge 90 ];then

echo "信息1"

elif [ $x -ge 80 ];then

echo "信息2"

elif [ $x -ge 60 ];then

echo "信息3"

else

echo "信息4"

fi

-------------------------------------

四,循环,可以反复执行某任务

for循环,可以定义循环次数

for 变量名称 in 1  2  3 。。。。  //此处变量名可以自定义,通常习惯

i,值的多少决定了下面dodone之间的任务执行多少次,每个值之间有空

格,这里是有3个值,所以就循环执行指令3

do

任务

done

----------------------------------

#!/bin/bash

for i in a b c    //循环3

do

ping

echo nb

echo $i

done

-----------------------------------

#!/bin/bash

for i in {1..100}    //循环100

do

ping

echo nb

echo $i

done

-------------------------------------

#!/bin/bash

for i in $(cat  name.txt)    //循环批量创建name.txt里面所有用户,文档中每行是一个名字,该文档要提前创建,与脚本在同一目录下即可

do

useradd  $i

done

------------------------------------

编写脚本,可以测试192.168.2.1~192.168.2.10

#!/bin/bash

for i in {1..10}

do

ping -c 3 -i 0.2 -W 1 192.168.2.$i &> /dev/null

if [ $? -eq 0 ];then

echo "通了"

else

echo "不通"

fi

done

--------------------------------------

改良版,可以统计最终通了和不通的数量

#!/bin/bash

x=0

y=0

for i in {1..10}

do

ping -c 3 -i 0.2 -W 1 192.168.2.$i &> /dev/null

if [ $? -eq 0 ];then条件测试 、 if选择结构 、 循环结构

echo "192.168.2.$i 通了"

let x++        //如果通了一台就把变量x+1

else

echo "192.168.2.$i 不通"

let y++        //如果不通了一台就把变量y+1

fi

done

echo "$x台通了,$y台不通"  

 

------------------------------------------------------------------------

练习:

1,列出常见的整数值比较操作,并说明各自作用。

 

2,运用条件测试操作,检查当前的用户是否为root

 

3,绘图描述if双分支结构的执行流程。

 

4[ -z $abc ] && echo "yes" || echo "no" 可以实现什么测试效果。

 

 

参考答案

1,列出常见的整数值比较操作,并说明各自作用。

-eq 等于

-ne 不等于

-ge 大于等于

-le 小于等于

-gt 大于

-lt 小于

2,运用条件测试操作,检查当前的用户是否为root

[ $USER == "root" ] && echo "yes" || echo no

3,绘图描述if双分支结构的执行流程。

if双分支结构判断一次条件,当条件成立时执行分支1、若不成立则执行分支2,如图-1所示。

条件测试 、 if选择结构 、 循环结构

-1

4[ -z $abc ] && echo "yes" || echo "no" 可以实现什么测试效果。

如果变量abc是空则显示yes,否则显示no

 


over


条件测试 、 if选择结构 、 循环结构  您阅读本篇文章共花了: 

分享到:

    扫描二维码推送至手机访问。

    版权声明:本文由有云转晴发布,如需转载请注明出处。

    本文链接:https://yyzq.cf/?id=70

    分享给朋友:

    发表评论

    访客

    ◎欢迎参与讨论,请在这里发表您的看法和观点。