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

Posted 小甘丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1-23-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

以上是关于1-23-shell脚本之-if流程控制语句和for循环语句的使用的主要内容,如果未能解决你的问题,请参考以下文章

oracle数据库之PL/SQL 流程控制语句

java之流程控制之if语句

JAVA 流程控制之选择语句

Shell编程Shell中的流程控制之if语句

MySQL基础--08---流程控制( IF CASE) 和 游标

shell脚本流程控制