一、三个脚本退出语句
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