- 1. For循环概述
- 1.拿到ip.txt中的第⼀个IP地址。 > #2.基于已经拿到的IP进⾏端⼝的探测(> nc > -z > 10> .0.0.7 > 80)>
- 1.使⽤for循环如何读⼊⽂件内容:
#2.for循环如何将这⾥的每⼀列进⾏拆分
[root@web01 shell-for]#cat for14.sh
- 2. while循环
- 3. while练习
- 4. 练习1
- 1.如何提取现在已有的数据库名称。 mysql -uroot -poldxu.com -e “showdatabases;” |grep -Ev “_schema|test|Database”
#2.如何去备份每⼀个数据库。 mysqldump -uroot -poldxu.com -B wordpress >/opt/wordpress.sql
[root@db01 ~]#cat while.sh
- 练习2
- 需求8:10以内能整除3的数值求和
- 需求9:使用for循环,打印九九乘法表
- *需求10:文件中的格式user:passwd 通过读入文件中的用户与密码文件,进行批量添加用户。
- 需求11: 批量创建用户,用户名cheng01-100 密码随机(8~12), 然后将创建成功的用户名及密码写入到一个文件中.
- 需求12:使用case实现批量删除用户。
- 需求13:查看当前系统已使用内存的百分比,如果以使用的内存占比超过50%则将后台运行的服务列出来,并让用户选择保持不变或者关掉某个服务,后再次显示使用内存的百分比,若还超过50%,则重复上述操作
- *需求14:使用for循环备份mysql库,每个库对应一个sql文件,需要排除没用的。
- *需求15:使用for嵌套循环实现分库分表备份。
- *需求16:编写一个上课随机点名脚本。
- 需求17:写一个倒计时脚本.
- 需求18:抓取
[https://mirrors.aliyun.com/zabbix/zabbix/4.0/rhel/7/x86_64/](https://mirrors.aliyun.com/zabbix/zabbix/4.0/rhel/7/x86_64/)
页面中的所有rpm包 wget
- 需求案例:
1. For循环概述
1.什么是循环:
重复去完成⼀个任务。循环在shell脚本中有什么使⽤的场景:
⽐如:每隔5分钟执⾏⼀次ping操作,可以使⽤定时任务,我们还可以使⽤循环的⽅式。
⽐如:每隔5分钟执⾏⼀次ping操作,ping的操作只执⾏100次,循环⽅式来实现。
2.什么是for循环:
for循环也叫 条件循环 ,假设给5个条件,那么我的for循环就会循环5次。结束后,脚本退出。
3.for循环基础语法示例
for 变量名 in [ 取值列表 ]
do
循环体需要执⾏的内容
done
取值方法1
#!/bin/bash
for var in test1 test2 test3 #或 test{1..3}
do
echo "This is $var"
done
**
赋值方法2
#!/bin/bash
for var in file1 "file2 file3" file4 "hello world" #给了4个条件还是6个条件
do
echo the text is $var
done
[root@manager ~/day3_case]# sh 1.sh
the text is file1
the text is file2 file3
the text is file4
the text is hello world
**
赋值方法3
#!/bin/bash #为list变量赋予了三个值
list="file1 file2 file3" #循环list变量,将list变量中的值挨个复制给 i 变量
for i in $list
do
echo var is $i
done
赋值方法4
#!/bin/bash
for i in $(cat /etc/hosts) #从文件中读入变量的方式
do
echo "$i"
done
#语法格式
for ((i=0;i<10;i++))
do
commmands
done
#第⼀步先执⾏ i=0
#第⼆部执⾏ 0<10
#第三部执⾏ commands命令
#第四部执⾏ i++ =1
#接下来就重复 第⼆部-->第四部 ---直到条件最终不成⽴停⽌
[root@bgx shell]# sh for-9.sh
num is 1 9
num is 2 8
num is 3 7
num is 4 6
num is 5 5
num is 6 4
num is 7 3
num is 8 2
num is 9 1
[root@web01 shell-for]# cat for06.sh
#!/bin/bash
a=0
b=10
for i in {1..9}
do
let a++; #自增
let b--; #自减
echo Number is $a $b
done
[root@web01 shell-for]# cat for07.sh
#!/bin/bash
for (( a=1,b=9; a<10; a++, b--))
do
echo num is $a $b
done
需求1:批量探测某个⽹段的主机存活状态,将存活的主机存⼊ok.txt⽂件中。
[root@web01 shell-for]# cat for08.sh
#!/bin/bash
# 10.0.0.0/24
for i in {1..254}
do
{
ip=10.0.0.$i
ping -c1 $ip &>/dev/null
if [ $? -eq 0 ];then
echo "$ip 存活"
fi
}&
wait #wait关键字确保每一个子进程都执行完成
done
需求2:判断主机存活状态,要求判断三次,如果三次失败则失败。
[root@web01 shell-for]# cat for09.sh
#!/bin/bash
for i in {1..254}do
{
ip=10.0.0.$i
ping -c1 $ip &>/dev/null
if [ $? -eq 0 ] ;then
echo "$ip 存活" >>ok.txt
else #如果ip不存活,则进⼊else阶段
for j in {1..3} #循环总共要运⾏3次(如果三次都结束就退
出当前的循环)
do
ping -c1 $ip &>/dev/null
if [ $? -eq 0 ];then
echo "探测$ip $j 次,成功" >> ok.txt
break #退出本次循环
else
echo "探测$ip $j 次,还是失败" >> err.txt
fi
done
fi
}&
done
如何探测
iptables -I INPUT -p icmp -j DROP
iptables -D INPUT 1
需求3: 现在有⼀个ip.txt的⽂件,⾥⾯有很多IP地址。还有⼀个port.txt的⽂件,⾥⾯有很多端⼝号。现在希望对ip.txt的每个IP地址进⾏端⼝的探测,探测的端⼝号来源于port.txt⽂件中,最后将开放的端⼝和IP保存到⼀个ok.txt⽂件。
#ip.txt port.txt
10.0.0.1 80
10.0.0.2 22
10.0.0.3 3306
10.0.0.4 23
10.0.0.5 443
10.0.0.6 9000
10.0.0.7 123
10.0.0.8 6379
10.0.0.9 10050
172.16.1.5 10051
192.168.10.1
172.16.1.6
[root@web01 shell-for]# cat ip.txt
10.0.0.1
10.0.0.210.0.0.3
10.0.0.4
10.0.0.5
10.0.0.6
10.0.0.7
10.0.0.8
10.0.0.9
10.0.0.31
10.0.0.51
172.16.1.7
172.16.1.8
172.16.1.51
172.16.1.5
192.168.10.1
172.16.1.6
[root@web01 shell-for]# cat port.txt
80
22
3306
23
443
9000
123
6379
10050
10051
思路:
1.拿到ip.txt中的第⼀个IP地址。 > #2.基于已经拿到的IP进⾏端⼝的探测(> nc > -z > 10> .0.0.7 > 80)>
[root@web01 shell-for]#
cat for15.sh
#!/bin/bash #第⼀层循环 for ip in $(cat ip.txt) do { ping -c1 $ip &>/dev/null if [ $? -eq 0 ];then #第⼆次循环 for port in $(cat port.txt) do nc -z -w 1 $ip $port &>/dev/null if [ $? -eq 0 ];then echo "$ip $port" >> ok.txt fi done else echo "$ip 不通所以没有进⾏端⼝探测.." fi }& done wait #等待任务执⾏完毕后,在释放窗⼝的操作
需求4:获取系统的所有⽤户并输出。效果如下:
This is 1 user: root This is 2 user: bin This is 3 user: daemon This is 4 user: adm ...............
[root@web01 shell-for]#
cat for10.sh
#!/bin/bash #1.设定i变量初始值为1 i=1 for user in $(awk -F ":" '{print $1}' /etc/passwd) do echo This is $i user: $user let i++ #让变量进⾏⾃增+1 done
需求5:批量创建100个⽤户,⽐如输⼊oldxu则会创建oldxu001-100。**
1.交互输⼊还是脚本传参 read | $1
2.⽤户填写oldxu
3.执⾏for循环进⾏批量创建⽤户
[root@web01 shell-for]#cat for11.sh
#!/bin/bash . /etc/init.d/functions read -p "请输⼊你要创建的⽤户名称: " us for i in {001..100} do username=${us}${i} if [ $? -eq 1 ];then useradd $username action "$username is create ok" /bin/true else action "$username already exists" /bin/false fi done
需求6:批量删除100个⽤户,⽐如输⼊oldxu则会删除oldxu001-100。
[root@web01 shell-for]#cat for12.sh
#!/bin/bash
. /etc/init.d/functions
read -p "请输⼊你要创建的⽤户名称: " us
for i in {001..100}
do
#将⽤户传递的名称+编号组成需要创建的⽤户名称
username=${us}${i}
id $username &>/dev/null
if [ $? -eq 0 ];then
userdel $username
action "$username is delete ok" /bin/true
else
action "$username is delete err" /bin/false
fi
done
需求5: —->>>使用case+for+基础命令
sh user.sh add oldxu #创建了100个⽤户
sh user.sh del oldxu #删除了100个⽤户
需要在执⾏脚本时传递两个参数:
$1 = add | del
$2 = username
1.使⽤case 来判断 $1
add 添加的操作
del 删除的操作
[root@web01 shell-for]# cat for13.sh
#!/bin/bash
. /etc/init.d/functions
if [ $# -ne 2 ];then
echo "请在执⾏脚本时进⾏参数传递 [ --del Username | --add Username ] "
exit
fi
case $1 in
add|--add)
for i in {1..100}
do
username=$2$i
if [ $? -eq 0 ];then
action "添加 $username 成功" /bin/true
else
action "添加 $username 失败" /bin/false
fi
done
;;
del|--del)
for i in {1..100}
do
username=$2$i
userdel $username &>/dev/null
if [ $? -eq 0 ];then
action "删除 $username 成功" /bin/true
else
action "删除 $username 失败" /bin/false
esac
done
1.使⽤for循环如何读⼊⽂件内容:
#2.for循环如何将这⾥的每⼀列进⾏拆分
[root@web01 shell-for]# cat for14.sh
#!/bin/bash
for i in $(cat user.txt)
do
user=$(echo $i | awk -F ":" '{print $1}') #将⼀⾏中的第⼀列赋值给user
变量
pass=$(echo $i | awk -F ":" '{print $2}') #将⼀⾏中的第⼆列赋值给pass
变量
#创建⽤户
useradd $user &>/dev/null && \
echo "$pass" | passwd --stdin $user &>/dev/null
if [ $? -eq 0 ];then
echo "$user 创建成功."
else
echo "$user 创建失败."
fi
done
2. while循环
1.什么是while循环:
和for循环⼀样,也是做循环的。
2.while循环,for循环,什么情况下使⽤while、什么情况下使⽤for
1.知道循环次数的情况下使⽤for,⽐如⼀天循环24次。
2.不知道要循环多少次,那么就使⽤while,⽐如弄⼀个猜数字的脚本游戏,每个⼈猜对的次数是未知的。
死循环、就是⼀直循环下去,那么这种场景也是选择while循环。 ( 公交汽⻋ )
3.有循环停止的条件时
3.while循环基础语法
while 条件测试 (条件为真,就执⾏循环体)
do
循环体要执⾏的内容
done
[root@web01 shell-while]#
sh while01.sh
#!/bin/bash
var=10
while [ $var -gt 0 ]
do
echo "number is $var"
var=$[ $var -1 ] #将重新复制给var变量
done
number is 10
number is 9
number is 8
number is 7
number is 6
number is 5
number is 4
number is 3
number is 2
number is 1
[root@web01 shell-while]# cat while02.sh
#!/bin/bash
while [ $num -ge 1 ] #如果num变量⼤于0则执⾏
do
echo "$num * $num = $[ $num * $num ]" # 9 * 9 = 80
num=$[ $num -1 ] # num=8
done
exit
echo "USAGE: sh $0 [ --add | --del | add | del ]"
*)
;;
done
fi
9 * 1 = 9 8 * 2 = 16
7 * 3 = 21
6 * 4 = 24
5 * 5 = 25
4 * 6 3 * 7 2 * 8
1 * 9
[root@web01 shell-while]# cat while03.sh
#!/bin/bash
a=9 b=1
while [ $a -ge 1 ]
do
echo "$a * $b = $[ $a * $b ]"
#⾃减
a=$[ $a -1 ]
#⾃增
b=$[ $b +1 ]
[root@web01 shell-while]# sh while03.sh
9 * 1 = 9 8 * 2 = 16
7 * 3 = 21
6 * 4 = 24
5 * 5 = 25
4 * 6 = 24
3 * 7 = 21
2 * 8 = 16
1 * 9 = 9
循环嵌套整数⽐对,判断⽤户输⼊的数值是否⼤于0,如果⼤于0,则三秒输出⼀次⼤于。
[root@web01 shell-while]#cat while04.sh
#!/bin/bash
# File Name: while04.sh
read -p "请输⼊数字: " num
while [ $num -ge 0 ]
done
sleep 3
1.exit, 退出脚本 。退出程序。当脚本碰到了exit时,直接退出,剩余不管有多少代码都不执⾏。
⽐如:原本要循环10次,但是我可以在第五次执⾏完成后退出循环。 环。在我们使⽤循环语句进⾏循环的过程中,有时候需要在未达到循环结束条件时候,强制跳出该循
循环中的关键字 break、continue、exit
循环嵌套字符⽐较,判断⽤户输⼊的⽤户名,如果不是root则⼀直让其输⼊
存在⾃动退出。
循环嵌套⽂件⽐较,判断/tmp/oldxu⽂件是否存在,如果不存在则3s输出⼀次 not found。如果
echo "⼤于"
do
[root@web01 shell-while]# cat while05.sh
#!/bin/bash
while [ ! -d /tmp/oldxu ]
do
echo "not found /tmp/oldxu"
sleep 3
done
[root@web01 shell-while]# cat while06.sh
#!/bin/bash
read -p "请输⼊⽤户名称: " account
while [ $account != "root" ]
do
read -p "请输⼊⽤户名称: " account
done
[root@web01 shell-while]# cat while07.sh
#!/bin/bash
for i in {1..3}
do
echo "Done...."
exit #退出脚本,不管后⾯还有多少代码。
done
echo "456"
echo "123"
[root@manager ~/day3_for]# sh while07.shh
Done....
2.break, 结束当前循环 ,但会执行之后的所有代码。
[root@web01 shell-while]# cat while07.sh
#!/bin/bash
for i in {1..3}
do
echo "Done...."
break
echo "456"
done
echo "123"
[root@manager ~/day3_for]# sh while07.sh
Done....
123
3.continue, 忽略本次循环 剩余的所有代码,直接进⾏下⼀次循环,直到循环结束,然后继续执行循环以外的代码。
[root@web01 shell-while]# cat while07.sh
#!/bin/bash
for i in {1..3}
do
echo "Done...."
continue
echo "456"
done
echo "123"
#!/bin/bash
[root@manager ~/day3_for]# sh while07.sh
Done....
Done....
Done....
123
3. while练习
循环嵌套continue,打印1-9当数值为5则跳过本次循环,继续下⼀次循环。请分别使⽤for和while实现。
[root@web01 shell-while]# cat while08.sh
#!/bin/bash
for i in {1..10}
do
if [ $i -eq 5 ];then
continue
fi
echo $i
done
#!/bin/bash
i=0
while [ $i -lt 10 ]
do
i=$[ $i + 1 ]
if [ $i -eq 5 ];then
continue
fi
echo " 数字: $i"
done
循环嵌套break,打印1-9当数值为5则停⽌。请分别使⽤for和while实现。
[root@web01 shell-while]# cat fo-010.sh
#!/bin/bash
for i in {1..9}
do
if [ $i -eq 5 ];then
break
fi
echo $i
done
[root@web01 shell-while]# cat while-010.sh
#!/bin/bash
i=1
while [ $i -le 10 ]
do
if [ $i -eq 5 ];then
break
fi
echo $i
done
1.使⽤while读⼊⽂件⽅式,批量创建⽤户
1.必须得有⼀个⽤户的⽂件。 2.如何使⽤while读⼊⽂件。
[root@web01 shell-while]# cat while10.sh
#!/bin/bash
. /etc/init.d/functions
#将每⼀⾏赋值给line
while read line
do
id $line &>/dev/null
if [ $? -eq 1 ];then
useradd $line
action "$line is ok" /bin/true
else
action "$line is err" /bin/false
continue
fi
done<user.txt
2.使⽤while读入文件方式,批量创建用户以及密码 user:passwd
[root@web01 shell-while]# cat while11.sh
#!/bin/bash
. /etc/init.d/functions
while read line
do
user=$(echo $line | awk -F ":" '{print $1}')
pass=$(echo $line | awk -F ":" '{print $2}')
#创建⽤户前,先判断⽤户是否存在
id $user &>/dev/null
if [ $? -eq 1 ];then #$?等于1表示该⽤户没有被创建
useradd $user && \
echo "$pass" | passwd --stdin $user &>/dev/null
else
action "$user Create Error" /bin/false
continue
fi
done<user.txt
3.示例: 猜数字游戏
1)随机输出⼀个1-100的数字 echo $(($RANDOM%100))
2)要求⽤户输⼊的必须是数字(数字处加判断)
3)如果⽐随机数⼩则提示⽐随机数⼩了 ⼤则提示⽐随机数⼤了
4)正确则退出 错误则继续死循环
5)最后统计猜了多少次(猜对了多少次,失败多少次)
[root@web01 shell-while]# cat while12.sh
#!/bin/bas
# File Name: while12.sh
sj=$[ $RANDOM%100 ] #指定随机数为1000以内的数字!!!!!
#作弊器开关
#echo $sj
#计数器
count=0
while true
do
read -p "猜数字游戏,请输⼊摇奖号码: " num
#回⻋
if [ -z $num ];then
continue
fi
#字⺟
if [[ ! $num =~ ^[0-9]+$ ]];then
echo "请输⼊整数 [0-100]"
continue #不满足条件就无限输出提示-->>> 请输⼊整数 [0-100]
fi
#⾃增这个count的变量
count=$[ $count +1 ]
#⽐对:sj变量的值,与 ⽤户输⼊的值是否⼀致
if [ $sj -eq $num ];then
echo "恭喜你才对了...."
echo "你总共猜了 $count 次,失败了 $[ $count -1 ]"
exit
else
if [ $sj -ge $num ];then
echo "你猜的太⼩了,重新来把..."
else
echo "你猜的太⼤了,重新来把...."
fi
fi
done
4示例:如下字符串 efbaf275cd、4be9c40b8b、44b2395c46、是通过对随机数变量RANDOM随机执行命令:echo $RANDOM|md5sum|cut –c1-10
后的结果,请破解这些字符串对应的RANDOM值。
#!/bin/bash
for j in efbaf275cd 4be9c40b8b 44b2395c46
do
{
i=0
while [ "$Rand" != "$j" ]
do
i=$[ $i +1 ]
Rand=$(echo $i| md5sum | cut -c1-10)
done
echo " $j 该随机数对应的值为 $i"
}&
done
wait
4. 练习1
需求: 扫描端口
需求:
现在有一个ip.txt的文件,里面有很多IP地址。
还有一个port.txt的文件,里面有很多端口号。
现在希望对ip.txt的每个IP地址进行端口的探测,探测的端口号来源于port.txt文件中,最后将开放的端口和IP保存到一个ok.txt文件。
#/bin/bash
# 第一层循环需要拿到IP地址
for ip in $(cat ip.txt)
do
# 第二层循环,针对IP进行端口探测
for port in $(cat port.txt)
do
nc -z $ip $port &>/dev/null
if [ $? -eq 0 ];then
echo "${ip}:${port} is ok...." >> ip_port.txt
fi
done
done
需求:使用for循环备份mysql库,每个库对应一个sql文件,需要排除没用的。
1.如何提取现在已有的数据库名称。 mysql -uroot -poldxu.com -e “showdatabases;” |grep -Ev “_schema|test|Database”
#2.如何去备份每⼀个数据库。 mysqldump -uroot -poldxu.com -B wordpress >/opt/wordpress.sql
[root@db01 ~]# cat while.sh
Path=/Backup/mysql
Date=$(date +%F)
Mysql_User=root
Mysql_Pass=123
Mysql_List=$(mysql -u${Mysql_User} -e "show databases;"| sed 1d |grep -Ev "*_schema|mysql")
# 备份文件的存储目录
if [ ! -d $Path/$Date ];then
mkdir -p $Path/$Date
fi
# 备份数据库
for database in ${Mysql_List}
do
mysqldump -u ${Mysql_User} --databases ${database} > $Path/$Date/${database}.sql
if [ -f "$Path/$Date/${database}.sql" ];then
if [ -s "$Path/$Date/${database}.sql" ];then
echo "备份 ${database} 成功"
fi
else
echo "备份 ${database} 失败"
fi
done
需求:筛选 [ 2.txt 在 1.txt里 ] 没有的IP 。
[root@web01 shell-while]# cat for_diff.sh
#/bin/bash
for i in $(cat 2.txt)
do
file=$(grep -w "$i" 1.txt |wc -l)
if [ $file -eq 0 ];then
echo "$i"
fi
done
-其他方法
[root@web01 shell-while]# cat for_diff2.sh
#/bin/bash
grep -vf 1.txt 2.txt
-结果:
10.0.0.3
10.0.0.4
10.0.0.7
需求:获取系统的所有用户并输出。效果如下:
This is 1 user: root
This is 2 user: bin
This is 3 user: daemon
This is 4 user: adm
...............
1.怎么获取所有的用户
2.遍历/etc/passwd这个文件
3.如何让数字的编号进行
[root@manager for]# cat for-12.sh
#!/bin/bash
i=1
user=$(cat /etc/passwd |awk -F ":" '{print $1}')
for ur in $user
do
echo "This is ${i} $ur"
i=$[ $i +1 ]
sleep 1
done
练习2
需求8:10以内能整除3的数值求和
#!/bin/bash
sum=0
for i in {1..10}
do
j=$[ $i % 3 ]
if [ $j -eq 0 ];then
sum=$[ $sum + $i ]
fi
done
echo "10以内能整除3的和是: $sum"
需求9:使用for循环,打印九九乘法表
for i in {1..9}
do
for j in {1..9}
do
echo -ne "$i * $j = $[ $i*$j ]\t"
if [ $i == $j ];then
echo -e "\n"
break
fi
done
done
*需求10:文件中的格式user:passwd 通过读入文件中的用户与密码文件,进行批量添加用户。
(遇到切割一行的不同小节时,可以使用echo 捕捉,再处理)
[root@manager for]# cat for-16.sh
#!/bin/bash
for user in $(cat user.txt)
do
#直接使用awk取值会出现问题,此时使用echo捕捉
us=$(echo $user |awk -F ":" '{print $1}')
pw=$(echo $user |awk -F ":" '{print $2}')
id $us &> /dev/null
if [ $? -eq 0 ];then
continue
else
useradd $us
echo "$pw" | passwd --stdin $us &> /dev/null
echo "$us is create ok......"
fi
done
需求11: 批量创建用户,用户名cheng01-100 密码随机(8~12), 然后将创建成功的用户名及密码写入到一个文件中.
[root@manager for]# cat for-17.sh
#!/bin/bash
. /etc/init.d/functions
i=8
read -p "请输入你需要创建用户的前缀:" qian
if [ -z $qian ];then
echo "不能输入回车"
exit
fi
for user in {1..10}
do
id $qian$user &> /dev/null
if [ $? -ne 0 ];then
useradd $qian$user
mkpasswd -l $i
i=$[ $i +1 ]
echo "$qian$user:$(mkpasswd -l $i)" >> pass.txt
echo "$qian$user 创建成功"
fi
done
需求12:使用case实现批量删除用户。
1.提示用户输入需要删除的用户以及删除的个数。
2.如果用户存在则删除,如果不存在则提示no such user。
[root@manager for]# cat userdel.sh
#!/bin/bash
#Date: 2019-10-31
#FileName: userdel.sh
#Description:
read -p "请输入删除用户的前缀:" qian
if [ -z $qian ];then
echo "请输入用户前缀"
fi
read -p "请输入你要删除几个:" num
if [[ ! $num =~ ^[0-9]+$ ]];then
echo "请输入数字"
exit
fi
for user in {1..100}
do
id $qian$num &> /dev/null
if [ $? -eq 0 ];then
userdel $qian$user
echo "$qian$user 删除成功"
else
echo "$qian$user no such user"
fi
done
需求13:查看当前系统已使用内存的百分比,如果以使用的内存占比超过50%则将后台运行的服务列出来,并让用户选择保持不变或者关掉某个服务,后再次显示使用内存的百分比,若还超过50%,则重复上述操作
*需求14:使用for循环备份mysql库,每个库对应一个sql文件,需要排除没用的。
1.如何拿到所有的库名称 wordpress jpress zabbix zrlog
2.循环拼接备份命令 mysqldump -uroot -pcheng.com -B zabbix >/mysql/data/zabbix.sql
[root@db01 ~]# cat mysql-db.sh
#!/usr/bin/bash
db_path=/backup/mysql
date_time=$(date +%F)
db_name=$(mysql -uroot -e "show databases" |sed 1d |egrep -v "*_schema|test|mysql")
[ -d $db_path ] || mkdir -p $db_path
for i in $db_name
do
mysqldump -uroot -B ${i} > $db_path/${i}_${date_time}.sql
if [ -f $db_path/${i}_${date_time}.sql ];then
echo "$i backup is OK....."
else
echo "$i backup is error...."
fi
done
#保留最近180天的数据
if [ -f $db_path/$date_time/day.txt ];then
touch $db_path/$date_time/day.txt
find $db_path -type f -mtime +180 -delete > $db_path/$date_time/day.txt
fi
*需求15:使用for嵌套循环实现分库分表备份。
&&左边的命令(命令1)返回真(即返回0,成功被执行)后,&&右边的命令(命令2)才能够被执行;
||则与&&相反。如果||左边的命令(命令1)未执行成功,那么就执行||右边的命令(命令2)
;如果左边的命令执行成功了,那么就不会执行右边的命令。
[root@db01 ~]# cat mysql-backup.sh
#!/usr/bin/bash
#准备备份环境,活得备份数据
db_user=root
db_path=/backup/mysql
db_time=$(date +%F)
db_name=$(mysql -u${db_user} -e "show databases;" | sed 1d | egrep -v "*_schema|mysql|test")
#1. 准备备份目录
[ -d ${db_path} ] || mkdir -p ${db_path}
#2.获得所有库名称
for dataname in ${db_name}
do
#3. 活得所有表名称
table_list=$(mysql -u${db_user} -e "use ${dataname};show tables;" | sed 1d )
for tablename in ${table_list}
do
#4.创建备份目录
[ -d ${db_path}/${dataname}/${db_time}/ ] || mkdir -p ${db_path}/${dataname}/${db_time}/
#5.执行本分操作
mysqldump -u${db_user} ${dataname} ${tablename} > ${db_path}/${dataname}/${db_time}/${tablename}
done
done
*需求16:编写一个上课随机点名脚本。
[root@manager for]# cat for-20.sh
#!/bin/bash
line=$(cat list.txt |wc -l)
sj=$[ ${RANDOM} % (${line}+1) ]
for i in $(seq ${line})
do
if [ $sj -eq $i ];then
Name=$(cat list.txt | sed -n ${i}p)
echo "点到 ${Name}"
fi
done
需求17:写一个倒计时脚本.
[root@manager for]# cat for-19.sh
#!/bin/bash
#Date: 2019-10-31
#FileName: for-19.sh
#Description:
for i in {9..1}
do
echo -ne "$i\b"
sleep 1
done
echo -e "\b hello world"
[root@manager for]# cat for-19.sh
#!/bin/bash
#Date: 2019-10-31
#FileName: for-19.sh
#Description:
for i in {10..1}
do
echo -n -e "最后倒计时: $i \r"
sleep 1
done
需求18:抓取[https://mirrors.aliyun.com/zabbix/zabbix/4.0/rhel/7/x86_64/](https://mirrors.aliyun.com/zabbix/zabbix/4.0/rhel/7/x86_64/)
页面中的所有rpm包 wget
[root@manager for]# cat for-24.sh
#!/bin/bash
#1.获取网页的源代码
#2.对网页源代码进行过滤筛选,提取文件名称
#3.将下载的url和文件名称拼接,通过wget下载
Url_File=url.txt
Pkg_Name=$(grep "<a href=" $Url_File | awk -F '"' '{print $2}' | egrep -v "debuginfo|repodata|\.\./")
Get_Url=https://mirrors.aliyun.com/zabbix/zabbix/4.0/rhel/7/x86_64/
for package in $Pkg_Name
do
#完整的下载url地址
url_package=$Get_Url$package
#指定下载至某个目录
wget -O /mnt/$package $url_package &>/dev/null
#判断下载是否正常
if [ $? -eq 0 ];then
echo "软件包: $pkg is ok..."
fi
done
需求案例:
需求1:
前提: 以;作为分隔符( 一行中有3列 )
1.判断域名访问时间,超过5s,执行第三列
2.第一列域名返回状态码是否是200,不是执行第三列
3.状态码是200,判断curl到的值是否和第二列一致,不一致,执行第三列
4.执行第三列时,输出日志
cat >list.txt<<'EOF'
http://minorapi.hiroop.com/api/demo?param=success;success;touch 1.txt
http://minorapi.hiroop.com/api/demo?param=wrong;success;touch 2.txt
http://minorapi.hiroop.com/api/demo?param=success;error;touch 3.txt
http://minorapi.hiroop.com/api/demo?param=timeout;right;touch timeout.txt
http://minorapi.hiroop.com/api/demo?param=right;right;touch 4.txt
http://minorapi.hiroop.com/api/demo?param=500;right;touch 50.txt
http://minorapi.hiroop.com/api/demoxxx?param=right;right;touch 404.txt
EOF
#!/bin/bash
#1.判断域名访问时间,超过5s,执行第三列
#2.第一列域名返回状态码是否是200,不是执行第三列
#3.状态码是200,判断curl到的值是否和第二列一致,不一致,执行第三列
#4.执行第三列时,输出日志
# while 按照行读取
Date=$(date +%F-%T)
timeout=5
while read url
do
url_api=$(echo $url | awk -F ';' '{print $1}')
url_result=$(echo $url | awk -F ';' '{print $2}')
url_action=$(echo $url | awk -F ';' '{print $3}')
# 设定响应的变量
url_all=$(curl -s -w "\n%{http_code}\n%{time_total}" ${url_api})
url_code_site=$(echo $url_all |xargs -n1 | awk 'NR==1') #内容
url_code_status=$(echo $url_all|xargs -n1| awk 'NR==2') #状态
url_code_time=$(echo $url_all | xargs -n1 | awk 'NR==3') #时间
# 1.判断超时时间
if [ ${url_code_time%%.*} -gt ${timeout} ];then
$url_action
echo "时间: ${Date} 请求的url: $url_api , 请求的时间: ${url_code_time} 执行的动作: $url_action"
continue #
fi
#2.第一列域名返回状态码是否是200,不是执行第三列
if [ ${url_code_status} -eq 200 ];then
#3.状态码是200,判断curl到的值是否和第二列一致,不一致,执行第三列
if [ "${url_code_site}" != "${url_result}" ];then
$url_action
echo "时间: ${Date} 请求的url: $url_api , 请求的时间: ${url_code_time} 执行的动作: $url_action"
fi
else
$url_action
echo "时间: ${Date} 请求的url: $url_api , 请求的时间: ${url_code_time} 执行的动作: $url_action"
fi
done<list.txt
需求2:
如果有使用"oldboy"用户登录系统,则立即踢出它并将其IP拉入黑名单,以防止该用户继续使用该IP地址进行登录。
写入sshd:username ip地址 内容至 /etc/hosts.deny则可拒绝用户登陆系统。
w获取登录信息,ip,登录tty
pkill -kill tty