shell脚本之-if流程控制语句和for循环语句的使用

大纲:

1、逻辑判断

2、if流程控制语句

3、for循环控制语句

 

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

在开始之前,先了解一下逻辑判断符号:

&& 与、|| 或、

A && B  必须A,B同时成立,才能通过判断

---> 判断流程:先执行A判断其是否成立,若成立,则继续执行B,判断其是否成立

---> 若不成立,则直接结束,不再执行B

A || B  A、B有一个成立,即可通过判断

!A     若A不成立,则通过判断

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

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

在条件判断时,那面会比较数值或字符串,这是我们会用到一些参数和符号,如下

比较数值:

等于 ---> –eq

不等于 ---> –ne

小于 ---> –lt

大于 ---> –gt 

小于等于 ---> –le

大于等于 ---> –ge

一些英文单词:帮助记忆

equal等于、not equal、less than、great than

比较字符串:

= 等于、== 等于,同=、!= 不等于、> 大于、<小于、-z字符串为空、-n字符串非空null

注意:在[]结构中,<和>需要使用转义符号,如下图

image

实战1:判断当前系统语言环境

image

[root@xiaogan 02]# echo $LANG 
en_US.UTF-8 
[root@xiaogan 02]# echo $LANG | awk -F . '{print $1}' 
en_US 
[root@xiaogan 02]# vim lang.sh 
[root@xiaogan 02]# sh -x lang.sh 
++ echo en_US.UTF-8 
++ awk -F . '{print $1}' 
+ language=en_US 
+ '[' en_US = en_US ']' 
+ echo 'The Default Language is English.' 
The Default Language is English. 
[root@xiaogan 02]# cat lang.sh 
#!/bin/bash 
# judged if the System Default Language is English

language=$(echo $LANG | awk -F . '{print $1}')

if 
    [ $language = 'en_US' ] 
then echo "The Default Language is English." 
else echo "You are wrong!" 
fi

[root@xiaogan 02]#


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

if流程控制语句

 

if语句有三种使用方式:

格式如下:

单分支:

if 条件判断语句

then 执行语句

fi

双分支:

if 条件判断语句

then 执行语句

else 执行语句

fi

多分支:

if 条件判断语句

then 执行语句

else 执行语句

fi

################################## 
实战1:if单分支--->应用

image

源码如下:

#!/bin/bash 
# if 
# then 
# fi

if [ ! -d /root/cdrom ] 
then echo "/root/cdrom is not exist!" 
fi 

################################## 
实战2:if双分支应用--->pinghost.sh 
ping -c 3 -i 0.2 -w 3 192.168.0.1

-c 发送数据包个数

-i 数据包每次发送间隔时间,默认单位:秒(s)

-w 等待时间,超过返回失败

image

源码如下:

#!/bin/bash 
# ping a given host and print the host status

ping -c 3 -i 0.2 -w 3 $1 >>/dev/null #-c count -i  -w wait 
if [ $? -eq 0 ] 
then echo "the host $1 is up." 
else echo "the host $1 is down." 
fi

##################################

实战3:if多分支应用--->判断数值区间 num_where.sh 

image

源码如下:

#!/bin/bash 
# judged the input score

read -p "input you score(0-100):" num

if [ $num -gt 85 ] && [ $num -lt 100 ] 
then echo "Great! Good Good Study!!" 
else echo "Day Day Up!" 
fi

##################################

实战4:if嵌套使用

编写脚本,监控服务运行状态, 
启动失败后,保存日志,并重启服务, 
再次失败,提示重启主机

image

源码如下:

#!/bin/bash

systemctl status $1 >>/var/log/ser.log

if [ $? -eq 0 ] 
then echo "the $1 is running." 
else echo "the $1 is dead." 
    systemctl start $1 >>/dev/null 
    if [ $? -eq 0 ] 
    then echo "Reboot finish!" 
        systemctl restart $1 
    else echo "Warnning You to Reboot your server!" 
    fi 
fi

################################## 
实战5:查询内核版本,并输出信息

image

源码如下;

#!/bin/bash 
# search the major version of System, and print info.

prime=$(uname -r | awk -F . '{ print $1}')

if [ $prime -gt 2 ] 
    then echo "The major version of System is $prime." 
elif [ $prime -lt 1 ] 
    then echo "The System is too low." 
else echo "Failed!" 
fi

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

for循环控制语句

用法:

for 变量名 in 变量遍历列表

do

循环语句

done #循环结束表示

##################################

实战:用户管理(批量添加用户)

方法一:

运行环境:

image

输出结果:

image

批量删除用户:

image

方法一优化:

我们发现,在用方法一批量添加用户是,当用户不存在时,会有报错信息。查看运行过程如下:

sh –x for01_useradd.sh

image

在进入循环后,我们会首先查找/etc/passwd下,是否已存在用户$user,

但是,在运行过程中,我们发现,当这个用户不存在时user_a数值为空,判断条件就会少了一个比较值,而造成判断条件变为:[ = xiaogan ],这是系统就会报错!

为了避免系统报错,我们可使用-z 或 -n选项来判断user_a变量是否为空。

image

执行结果如下:

image

方法二:我们也可以采取另外一种方法,来批量添加用户

image

各方法源码如下:

方法一:

#useradd.sh

#!/bin/bash 
userlist=$( cat user.list )


for user  in $userlist 
do 
user_a=$(grep -w "$user" /etc/passwd  | awk -F : '{print $1}' ) 
if 
    [ $user_a = $user ] 
then 
    echo "The user $user is already exist." 
else 
    useradd $user #2>>/dev/null 
    echo "User $user is added." 
fi 
done

###########

#userdel.sh

#!/bin/bash 
userlist=$( cat user.list )

for user  in $userlist 
do 
    userdel -r $user 2>>/dev/null 
    if [ $? = 0 ] 
    then 
        echo "The user $user is deleted!" 
    fi 
done

优化:

#useradd.sh

#!/bin/bash 
userlist=$( cat user.list )


for user  in $userlist 
do 
user_a=$(grep -w "$user" /etc/passwd  | awk -F : '{print $1}' ) 
if 
   # [ $user_a = $user ] 
    [ ! $user_a -z ] && [ $user_a = $user ]  
    # To determine whether user_a is empty, not empty in to continue 
then 
    echo "The user $user is already exist." 
else 
    useradd $user #2>>/dev/null 
    echo "User $user is added." 
fi 
done

方法二:

#new useradd.sh

#!/bin/bash 
# Batch add user by scripts 
# the new method

userlist=$( cat user.list )

for user in $userlist 
do 
    useradd $user 2>>/dev/null 
    if 
        [ $? -eq 0 ] 
    then 
        echo "123456" | passwd --stdin $user >> /dev/null 
        echo "Useradd Success!" 
    else 
        echo "The user $user is already exists." 
    fi 
done

##################################

实战:ping.sh #批量测试IP地址是否连通

 image 
源码如下:

#!/bin/bash

ip_list=$( cat ip.list )

for ip in $ip_list 
do 
    ping -w 3 -c 3 -i 0.2 $ip >>/dev/null 
    if [ $? -eq 0 ] 
        then echo "the $ip is up." 
    else echo "the $ip is down." 
    fi 
done

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值