shell条件测试操作 if分支 for循环 while 循环

目录

 

条件测试操作

条件测试的基本用法:

字符串条件测试:

逻辑组合

数字的条件测试:

编写一个脚本:

对文件进行测试:

if判断语句

单分支

双分支

多分支

编写一个脚本:

编写一个脚本:

for循环

while循环:可以无限循环


条件测试操作

条件测试的基本用法:

  • "test   表达式"或者[  表达式    ]都可以,表达式两边至少要留出一个空格
[root@server0 opt]# test a ==  a     #判断字符串a是否等于a
[root@server0 opt]# echo $?          #查看结果,0为判断成功,非0为失败
0
[root@server0 opt]# test a ==  b
[root@server0 opt]# echo $?
1
[root@server0 opt]# [ a == a  ]       #另一种格式,效果同上,字符串两边要有空格!!!
[root@server0 opt]# echo $?
0
[root@server0 opt]# [ a == b  ]
[root@server0 opt]# echo $?
1
[root@server0 opt]# [  $USER   ==    root   ]  #判断当前登录用户是否为root
[root@server0 opt]# echo $?
0

字符串条件测试:

  1. == 比较两个字符串是否相同  
  2. != 比较两个字符串是否不相同
  3. -z  检查变量的值是否为空值
  4. !  -z检查变量的值是否为非空值
  5. -n   检查变量的值是否为非空值(等同于!  -z)
[root@server0 opt]# [ a != b  ]  #判断a是否不能于b
[root@server0 opt]# echo $?

[root@server0 opt]# [  -z  $a   ]  #判断变量a是否为空值
[root@server0 opt]# echo $?        #如果为空值则输出为0
1
[root@server0 opt]# [  $a  == b   ]   #判断变量a是否等于b,如果变量a为空会报错
[root@server0 opt]# [  "$a"  == b   ]#解决上上述问题
[root@server0 opt]# echo $?
1
[root@server0 opt]# [ !  -z    $a    ]    #判断变量a是否非空
[root@server0 opt]# echo $?
0

-eq与==都有判断是否相等的意思,区别是"=="主要用于 判断字符串两边是否相等,而-eq主要用于判断数字

[root@server0 opt]# [ 0123  ==  123   ]
[root@server0 opt]# echo  $?
1
[root@server0 opt]# [ 0123  -eq  123   ]
[root@server0 opt]# echo  $?
0

逻辑组合

逻辑与:  && 之前命令成功才会执行之后的命令

逻辑或:   || 之前命令失败才会执行之后的命令

&&   前后任务都成功才算成功

||      前后有一个任务成功就算成功

[root@server0 opt]# vim test01.sh
#!/bin/bash
read -p   "请输入一个用户名"  a
[ -z   $a     ]  && echo "给我名字!"   && exit        #如果没有输入用户名输出"给我名字!"然后直接退出
useradd $a
stty  -echo
read -p "请输入密码" p
stty  echo 
echo $p  |  passwd --stdin $a
[root@server0 opt]# bash test01.sh
请输入一个用户名
给我名字!
[root@server0 opt]# ls && ls && ls     #三次都执行成功
rh  test01.sh
rh  test01.sh
rh  test01.sh
[root@server0 opt]# ls || ls || ls     #只有第一个条件成功
rh  test01.sh
[root@server0 opt]# ls || ls && ls     #第一个条件和第三个条件执行成功
rh  test01.sh
rh  test01.sh
[root@server0 opt]# ls && ls || ls     #第一个条件和第二个条件执行成功
rh  test01.sh
rh  test01.sh

数字的条件测试:

-eq 等于
-ne 不等于
-gt 大于
-ge 大于等于
-lt 小于
-le 小于等于
[root@server0 opt]# [ 10  -gt 10   ] || echo "ok"&& echo "no"
ok
no             #两次执行均成功,显示OK和no
[root@server0 opt]# [ 10  -gt 10   ] && echo "ok"|| echo "no"
no             #前次执行不成功

编写一个脚本:

每隔两分钟检查主机的登录账户数量,如果超过3人,则发邮件给管理员报警

[root@server0 opt]# vim test02.sh 
#!/bin/bash
a=$(who | wc  -l)      #统计有几个人登录该账户
[ $a  -gt 3  ] && echo "有人入侵!!!" | mail  -s test  root
[root@server0 opt]# bash test02.sh
 
可以多开几个终端试一下

[root@server0 opt]# mail 
Heirloom Mail version 12.5 7/5/10.  Type ? for help.
"/var/spool/mail/root": 1 message 1 new
>N  1 root                  Fri Jan  3 11:39  18/595   "test"
& 1
Status: R

有人入侵!!!

Held 1 message in /var/spool/mail/root
[root@server0 opt]# crontab -e  
*/2  *  *  *    *   /opt/test02.sh   #每隔两分钟执行该脚本
[root@server0 opt]# chmod +x  test02.sh    #一定要给脚本加权限!!!!!



[root@server0 opt]# rm  -rf  /var/spool/mail/root     #可以先删除所有邮件,该路径为专门存放root用户邮件
[root@server0 opt]# mail     #查看邮件

对文件进行测试:

-e 判断对象是否存在(不管是文件还是目录),存在则结果为真
-d 判断对象是否为目录,是则为真
-f 判断对象是否为一般文件,是则为真
-r 判断当前用户对文件是否有读权限
-w 判断当前用户对文件是否有写权限
-x 判断当前用户对文件是否有执行权限
[root@server0 opt]# [  -e  /opt/123   ]   #测试123是否存在,不关心文件类型
[root@server0 opt]# echo  $?
1
[root@server0 opt]# [   -f  /opt/123  ]    #测试123文件是否存在,必须是普通文件
[root@server0 opt]# echo  $?
1
[root@server0 opt]# mkdir abc
[root@server0 opt]# [   -f  /opt/abc  ]    #测试abc是否存在,必须是普通文件
[root@server0 opt]# echo  $?
1
[root@server0 opt]# [   -d  /opt/abc  ]    #测试abc是否存在,必须是目录
[root@server0 opt]# echo  $?
0
[root@server0 opt]# [   -r  /opt/abc  ]     #当前用户对abc是否能读
[root@server0 opt]# echo  $?
0
[root@server0 opt]# [   -w  /opt/abc  ]     #当前用户对abc是否能写
[root@server0 opt]# echo  $?
0
[root@server0 opt]# [   -x  /opt/abc  ]     #当前用户对abc是否能执行
[root@server0 opt]# echo  $?
0
                      #建议写绝对路径!

即使文件没有任何权限,用管理员身份测试rwx权限,rw依旧为0,x为非0


if判断语句

单分支

if   条件测试;then

     执行指令1

     执行指令2

      .......

fi 

双分支

if   条件测试;then

     执行指令1

else

    执行指令2   

fi

多分支

if   条件测试1;then

      执行指令1

elif    条件测试2;then

      执行指令2

else

     执行指令n

fi

if双分支: 

[root@server0 opt]# vim test03.sh
#!/bin/bash
if  [ $USER  ==  root   ];then
        echo  "ok"
else
        echo  "no"
fi

[root@server0 opt]# bash test03.sh
ok
[root@server0 opt]# su - student

[student@server0 ~]$ cd /opt

[student@server0 opt]$ bash test03.sh 
no

if多分支: 

[root@server0 opt]# vim test04.sh 
#!/bin/bash
read -p "请输入数字" n
if [ $n  -gt  90  ];then
        echo  "优秀"
elif [ $n  -gt  70  ];then
        echo  "良好"
elif [ $n  -gt  60  ];then
        echo  "及格"
else
        echo  "回炉"
fi
[root@server0 opt]# bash test04.sh
请输入数字

编写一个脚本:

对某一个IP进行ping操作,可以使用变量(read   或    位置变量$1),方便多次使用脚本

ping命令:  ping  -c  数字    指定ping的次数

                 ping   -i    数字   指定ping的间隔时间,默认ping的间隔时间为1秒钟

                 ping   -W  数字   指定ping的时候不通反馈时间(秒),提高效率

[root@server0 opt]# vim test05.sh
#!/bin/bash
ping -c  3  -i 0.2 -W  1  172.25.0.12  &>  /dev/null
if [ $?   -eq  0     ];then
        echo "通了"
else
        echo "不通"
fi
[root@server0 opt]# bash test05.sh
不通

编写一个脚本:

猜数游戏,计算机出一个随机的数字,你出一个数字,比计算机大则输出猜大了,比计算机小则输出猜小了,一样则输出恭喜你猜中了!

[root@server0 opt]# vim test06.sh
#!/bin/bash
for i in {1..20}
do
x=$[$RANDOM%10]
read  -p  "请输入一个数字(0-9)"  n
if [ $x  -eq  $n  ];then
        echo  "恭喜,猜对了!"&&  exit
elif [ $n  -lt  $x  ];then
        echo "猜小了,想知道正确答案吗,求我呀!"
else
        echo "猜大了,垃圾!"
fi
done


for循环

for   变量名称   in  值1  值2  值 3....

do  

        指令

done

[root@server0 opt]# vim test07.sh
#!/bin/bash
a=0
b=0
for i in `seq 15`   #也可以写成{1..15}
do
        ping -c 3 -i 0.1 -W 1  172.25.0.$i  &>  /dev/null
if [ $?  -eq 0   ];then
        echo "172.25.0.$i通了"
        let  a++
else
        echo "172.25.0.$i不通"
        let  b++
fi
done
[root@server0 opt]# bash test07.sh
172.25.0.1不通
172.25.0.2不通
172.25.0.3不通
172.25.0.4不通
172.25.0.5不通
172.25.0.6不通
172.25.0.7不通
172.25.0.8不通
172.25.0.9不通
172.25.0.10通了
172.25.0.11通了
172.25.0.12不通
172.25.0.13不通
172.25.0.14不通
172.25.0.15不通
2台通了,13台不通


while循环:可以无限循环

while   条件测试

do  

          执行指令

done

[root@server0 opt]# vim test08.sh
#!/bin/bash
while :             #冒号代表无限循环
do
        echo 123
        sleep 0.1
done
发布了37 篇原创文章 · 获赞 48 · 访问量 1675

猜你喜欢

转载自blog.csdn.net/tian1345/article/details/103826904
今日推荐