Linux——for、while、if、case四大shell语句简单举例

一、三个脚本退出语句

Exit 结束脚本,整体退出
Break 允许跳出所有循环(终止执行后面的所有循环)
Continue 提前结束当前循环,进入下一个循环

为了更清楚的了解这几个的区别进行以下实验:
root@desktop26 mnt]# cat test1.sh 
#######################################
# Author:       yifan                 #
# Version:                            #
# Mail:                               #
# Date:         2018-51-06/25/18      #
# Description:                        #
#                                     #
#######################################

#!/bin/bash
for NUM in {1..5}          //从1到4循环
do
        if 
        [ "$NUM " -eq  3 ]  //判断NUM是否等于3
    then  
          $1      //这里输入脚本后输入的三个测试值
    fi
    echo $NUM      
done
echo hello
[root@desktop26 mnt]# sh  test1.sh exit    //当NUM=3后直接全部退出脚本
1
2
[root@desktop26 mnt]# sh test1.sh continue  //当NUM=3后,不执行后面的“echo NUM”,直接进入下次循环
1
2
4
5
hello
[root@desktop26 mnt]# sh  test1.sh break  //结束for的所有循环,进入下一步命令“echo hello”
1
2
hello

这里写图片描述
这里写图片描述

二、for语句

for做的是批处理
格式:
for (变量)in (取值)
do
done

2.1 、{1..5}和`seq 1 5`的辨析

   {1..5}是1到5循环,`seq 1 5 `也是1到5循环,但不同的时seq可以设定步长 ,比如` seq 1 2 6`指的是从1到6每次增加两个数,而且seq 比”{}”更高级,其里面可以加变量名。但是“{}”内不可识别变量。

为了更清楚的比较,我们来看以下实验:
[root@desktop26 mnt]# cat test2.sh 
#!/bin/bash
for NUM in {1..5}     //{1..5}
do
        echo $NUM  
done
[root@desktop26 mnt]# sh  test2.sh 
1
2
3
4
5
[root@desktop26 mnt]# vim test2.sh
[root@desktop26 mnt]# cat test2.sh 
#!/bin/bash
for NUM in `seq 1 5`
do
        echo $NUM  
done
[root@desktop26 mnt]# sh  test2.sh 
1
2
3
4
5
[root@desktop26 mnt]# vim test2.sh
[root@desktop26 mnt]# cat test2.sh 
#!/bin/bash
for NUM in `seq 1 2 5`  //从1到5,步长为2,即1.3.5.
do
        echo $NUM  
done
[root@desktop26 mnt]# sh  test2.sh 
1
3
5

这里写图片描述
这里写图片描述

实验一:判断机房IP是否ping通

#!/bin/bash
for HOSTNUMBER in `seq 1 50`
do
   ping -c1 -w1 172.25.254.$HOSTNUMBER &>/dev/null && {    
          echo -e "\033[32m 172.25.254.$HOSTNUMBER is up;\033[0m"     
} || {
          echo -e "\033[31m 172.25.254.$HOSTNUMBER is down;\033[0m"
}        //ping通显示ip up ,否则显示 ip down,/033加的是输出的颜色值,此时需加-e识别。
done

[root@desktop mnt]# sh  check_host.sh 
 172.25.254.1 is up;
 172.25.254.2 is up;
 172.25.254.3 is up;
 172.25.254.4 is up;
 172.25.254.5 is up;
 172.25.254.6 is up;
 172.25.254.7 is up;
 172.25.254.8 is up;
 172.25.254.9 is up;
 172.25.254.10 is up;
 172.25.254.11 is up;
 172.25.254.12 is down;
 172.25.254.13 is up;
 172.25.254.14 is up;
 172.25.254.15 is down;
 172.25.254.16 is up;
 172.25.254.17 is up;
 172.25.254.18 is down;
 172.25.254.19 is up;
 172.25.254.20 is up;
 172.25.254.21 is up;
 172.25.254.22 is down;
 172.25.254.23 is up;
 172.25.254.24 is down;
 172.25.254.25 is up;
 172.25.254.26 is up;
 172.25.254.27 is up;
 172.25.254.28 is up;
 172.25.254.29 is up;
 172.25.254.30 is up;
 172.25.254.31 is down;
 172.25.254.32 is up;
 172.25.254.33 is up;
 172.25.254.34 is down;
 172.25.254.35 is up;
 172.25.254.36 is up;
 172.25.254.37 is up;
 172.25.254.38 is up;
 172.25.254.39 is up;
 172.25.254.40 is up;
 172.25.254.41 is up;
 172.25.254.42 is up;
 172.25.254.43 is up;
 172.25.254.44 is up;
 172.25.254.45 is up;
 172.25.254.46 is up;
 172.25.254.47 is up;
 172.25.254.48 is up;
 172.25.254.49 is up;
 172.25.254.50 is down;

这里写图片描述
这里写图片描述

实验二:建立一个数据库,利用脚本对所有数据库进行备份操作,每个数据库备份到一个文件中,并以.sql结尾,最后存储在到/mnt/mysql_dump目录下。

1.建立数据库:

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 5.5.35-MariaDB MariaDB Server

Copyright (c) 2000, 2013, Oracle, Monty Program Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> create database linux;
Query OK, 1 row affected (0.10 sec)

MariaDB [(none)]> use linux
Database changed
MariaDB [linux]> create table linux_user(
    -> username varchar(50) not null,
    -> password varchar(50) not null);
Query OK, 0 rows affected (0.14 sec)

MariaDB [linux]> insert into linux_user values("user1","123");
Query OK, 1 row affected (0.11 sec)

MariaDB [linux]> insert into linux_user values("user2","234");
Query OK, 1 row affected (0.10 sec)

MariaDB [linux]> select * from linux_user;
+----------+----------+
| username | password |
+----------+----------+
| user1    | 123      |
| user2    | 234      |
+----------+----------+2 rows in set (0.00 sec)

MariaDB [linux]> quit
Bye

这里写图片描述

2.编写脚本如下:

这里写图片描述

三、while语句

格式(当条件为真时执行do):
while true
do
done

实验一:编写脚本,实时监控根分区的使用情况,超过80%就给超级用户发送一封警告邮件

脚本内容:
[root@localhost mnt]# vim warning.sh
#!/bin/bash
NUM=`df -h | awk '/\/$/{print $5}' | awk -F "%" '{print $1}'`   //筛选出/使用情况百分比数字
while true
do
        [ "$NUM" -ge 80 ] && {
                echo "Your / will full !" | mail -s warning root
        }
        sleep 1    //每隔1秒执行一次
done                                                   

这里写图片描述

root@node1 mnt]# df  //查看根分区使用情况
Filesystem           Used Available Use% Mounted on
/dev/vda1           10473900 9488536    985364  29% /
devtmpfs              469344       0    469344   0% /dev
tmpfs                 484932      84    484848   1% /dev/shm
tmpfs                 484932   12784    472148   3% /run
tmpfs                 484932       0    484932   0% /sys/fs/cgroup
/dev/mapper/vg0-vo    483670    2368    451811   1% /home
[root@node1 mnt]# sh test.sh &  //执行脚本,并打入后台
[3] 4151
[root@node1 mnt]# mail  //查看没有邮件
No mail for root
[root@node1 mnt]# dd if=/dev/zero of=/bigfile bs=1M count=6000//截取6000M的内存使根分区使用率变成80%以上
[root@node1 mnt]# df
Filesystem             Used Available Use% Mounted on
/dev/vda1           10473900 9488536    985364  91% /
devtmpfs              469344       0    469344   0% /dev
tmpfs                 484932      84    484848   1% /dev/shm
tmpfs                 484932   12784    472148   3% /run
tmpfs                 484932       0    484932   0% /sys/fs/cgroup
/dev/mapper/vg0-vo    483670    2368    451811   1% /home
[root@node1 mnt]# sh test.sh &  //执行脚本并打入后台
[3] 4151
[root@node1 mnt]# mail  //可以查到邮件
Heirloom Mail version 12.5 7/5/10.  Type ? for help."/var/spool/mail/root": 23 messages 23 new
>N  1 root                  Thu Jun 27 03:11  18/590   "warning"
 N  2 root                  Thu Jun 27 03:11  18/590   "warning"
 N  3 root                  Thu Jun 27 03:11  18/590   "warning"
 N  4 root                  Thu Jun 27 03:11  18/590   "warning"

四、If语句

格式
if
then
elif
then
、、、、、
else
fi

实验一:编写脚本,判断文件类型

脚本内容:
#!/bin/bash
if
[ "$#" -ne "1" ]
then
    echo " please input a file  after script!!"

elif
[ ! -e "$1" ]
then
    echo " $1 is not exist! "
elif
[ -b "$1" ]
then

    echo " $1 is a block special!"
elif
[ -f "$1" ]
then

    echo " $1 is a regular file!"
elif
[ -L "$1" ]
then

    echo " $1 is a symbolic link! "
elif
[ -d "$1" ]
then

    echo " $1 is a directory! "
else
   echo unknow $1
fi

这里写图片描述

测试:
[root@localhost mnt]# sh check_file.sh mysql_dump
 mysql_dump is a directory! 
[root@localhost mnt]# sh check_file.sh check_file.sh 
 check_file.sh is a regular file!
[root@localhost mnt]# sh check_file.sh
 please input a file  after script!!

实验二:写一个创建用户的脚本,后更用户文件和密码文件且符合下列要求

1.文件数量不对报错;

2.文件不存在报错;

3.两个文件存在差异报错;4.用户存在时显示用户存在。但是不改变此用户的密码。

5.用户不存在时,建立用户并设定相应的密码

脚本内容:
[root@localhost mnt]# cat user_create.sh
#!/bin/bash
##############################Check Rule########################################
if
[ "$#" -ne "2" ]//判断输入文件是否为两个
then

    echo  -e "\033[31m please give me userfile and passfile after script !!\033[0m"   
    exit 1

elif
[ ! -e "$1" ]  //判断输入文件1是否为存在
then
    echo -e  "\033[31m $1 is not exist ! \033[0m "
    exit 1
elif
[ ! -e "$2" ] //判断输入文件2是否为存在
then
    echo -e  "\033[31m $2 is not exist ! \033[0m "
    exit 1
elif {
 N1=`awk 'BEGIN{N=0}{N++}END{print N}' $1`   //判断输入文件1、2行数是否对应相等
 N2=`awk 'BEGIN{N=0}{N++}END{print N}' $2`  
[ "$N1" -ne " $N2" ]
}
then

    echo -e "\033[31m $1's lines is not equal to $2's lines ! \033[0m "
    exit 1
fi
#############################Create User#####################################
for LINES in `seq 1 $N1`
do

        USERNAME=`sed -n "${LINES}p" $1`
        PASSWORD=`sed -n "${LINES}p" $2`
        useradd $USERNAME
        [ "$?" -eq "0" ]      //建立用户返回值为真则建立成功,否则不建立
        echo $PASSWORD | passwd --stadin $USERNAME &> /dev/null && echo $USERNAME created !
done

这里写图片描述

测试:
[root@localhost mnt]# cat userfile 
user1
user2
user3
[root@localhost mnt]# cat passfile 
123
456
[root@localhost mnt]# sh user_create.sh userfile passfile   //行数不相同
 userfile's lines is not equal to passfile's lines !  
[root@localhost mnt]# sh user_create.sh userfile 
 please give me userfile and passfile after script !!    //为加文件
[root@localhost mnt]# vim passfile 
[root@localhost mnt]# cat passfile   //行数相同
123
789
456
[root@localhost mnt]# sh user_create.sh userfile passfile  
[root@localhost mnt]# id user1
uid=1001(user1) gid=1001(user1) groups=1001(user1)
[root@localhost mnt]# id user2
uid=1002(user2) gid=1002(user2) groups=1002(user2)
[root@localhost mnt]# id user3
uid=1003(user3) gid=1003(user3) groups=1003(user3)    //建立成功
[root@localhost mnt]# vim user_create.sh
[root@localhost mnt]# sh user_create.sh userfile passfile  //用户已存在,不建立
useradd: user 'user1' already exists
useradd: user 'user2' already exists
useradd: user 'user3' already exists

这里写图片描述

五、case语句

格式:
case $1 in
dog) //第一种情况
echo cat
;;
cat) //第二种情况
echo dog
;;
*) //第三种情况
echo error
esac

实验一:测试if和case执行次数。

[root@localhost mnt]# cat test.sh    //for语句
#!/bin/bash
if
[ "$1" = "dog" ]  
then

   echo "cat!"
elif
[ "$1" = "cat" ]
then

  echo "dog!"
else

  echo "ERROR: please input "cat" or "dog" follow script !"
fi

[root@localhost mnt]# sh -x test.sh cat   //执行两次
+ '[' cat = dog ']'
+ '[' cat = cat ']'
+ echo 'dog!'
dog!
[root@localhost mnt]# sh -x test.sh dog  //执行一次
+ '[' dog = dog ']'
+ echo 'cat!'
cat!
[root@localhost mnt]# cat text1.sh   //case语句
#!/bin/bash
case $1 in
        dog)
        echo cat
    ;;
    cat)
    echo dog
    ;;
    *)
    echo error
esac
[root@localhost mnt]# sh -x  text1.sh dog  //执行一次
+ case $1 in
+ echo cat
cat
[root@localhost mnt]# sh -x  text1.sh cat  //执行一次
+ case $1 in
+ echo dog
dog

这里写图片描述
这里写图片描述
这里写图片描述

猜你喜欢

转载自blog.csdn.net/yifan850399167/article/details/80839970
今日推荐