1. For循环概述

1.什么是循环:

重复去完成⼀个任务。循环在shell脚本中有什么使⽤的场景:
⽐如:每隔5分钟执⾏⼀次ping操作,可以使⽤定时任务,我们还可以使⽤循环的⽅式。
⽐如:每隔5分钟执⾏⼀次ping操作,ping的操作只执⾏100次,循环⽅式来实现。

2.什么是for循环:

for循环也叫 条件循环 ,假设给5个条件,那么我的for循环就会循环5次。结束后,脚本退出。

3.for循环基础语法示例

  1. for 变量名 in [ 取值列表 ]
  2. do
  3. 循环体需要执⾏的内容
  4. done

取值方法1

  1. #!/bin/bash
  2. for var in test1 test2 test3 #或 test{1..3}
  3. do
  4. echo "This is $var"
  5. done

**

赋值方法2

  1. #!/bin/bash
  2. for var in file1 "file2 file3" file4 "hello world" #给了4个条件还是6个条件
  3. do
  4. echo the text is $var
  5. done
  6. [root@manager ~/day3_case]# sh 1.sh
  7. the text is file1
  8. the text is file2 file3
  9. the text is file4
  10. the text is hello world

**

赋值方法3

  1. #!/bin/bash #为list变量赋予了三个值
  2. list="file1 file2 file3" #循环list变量,将list变量中的值挨个复制给 i 变量
  3. for i in $list
  4. do
  5. echo var is $i
  6. done


赋值方法4

  1. #!/bin/bash
  2. for i in $(cat /etc/hosts) #从文件中读入变量的方式
  3. do
  4. echo "$i"
  5. done

#语法格式

  1. for ((i=0;i<10;i++))
  2. do
  3. commmands
  4. done
  5. #第⼀步先执⾏ i=0
  6. #第⼆部执⾏ 0<10
  7. #第三部执⾏ commands命令
  8. #第四部执⾏ i++ =1
  9. #接下来就重复 第⼆部-->第四部 ---直到条件最终不成⽴停⽌


  1. [root@bgx shell]# sh for-9.sh
  2. num is 1 9
  3. num is 2 8
  4. num is 3 7
  5. num is 4 6
  6. num is 5 5
  7. num is 6 4
  8. num is 7 3
  9. num is 8 2
  10. num is 9 1

[root@web01 shell-for]# cat for06.sh

  1. #!/bin/bash
  2. a=0
  3. b=10
  4. for i in {1..9}
  5. do
  6. let a++; #自增
  7. let b--; #自减
  8. echo Number is $a $b
  9. done

[root@web01 shell-for]# cat for07.sh

  1. #!/bin/bash
  2. for (( a=1,b=9; a<10; a++, b--))
  3. do
  4. echo num is $a $b
  5. done

需求1:批量探测某个⽹段的主机存活状态,将存活的主机存⼊ok.txt⽂件中。

[root@web01 shell-for]# cat for08.sh

  1. #!/bin/bash
  2. # 10.0.0.0/24
  3. for i in {1..254}
  4. do
  5. {
  6. ip=10.0.0.$i
  7. ping -c1 $ip &>/dev/null
  8. if [ $? -eq 0 ];then
  9. echo "$ip 存活"
  10. fi
  11. }&
  12. wait #wait关键字确保每一个子进程都执行完成
  13. done

**

需求2:判断主机存活状态,要求判断三次,如果三次失败则失败。

[root@web01 shell-for]# cat for09.sh

  1. #!/bin/bash
  2. for i in {1..254}do
  3. {
  4. ip=10.0.0.$i
  5. ping -c1 $ip &>/dev/null
  6. if [ $? -eq 0 ] ;then
  7. echo "$ip 存活" >>ok.txt
  8. else #如果ip不存活,则进⼊else阶段
  9. for j in {1..3} #循环总共要运⾏3次(如果三次都结束就退
  10. 出当前的循环)
  11. do
  12. ping -c1 $ip &>/dev/null
  13. if [ $? -eq 0 ];then
  14. echo "探测$ip $j 次,成功" >> ok.txt
  15. break #退出本次循环
  16. else
  17. echo "探测$ip $j 次,还是失败" >> err.txt
  18. fi
  19. done
  20. fi
  21. }&
  22. done

如何探测

  1. iptables -I INPUT -p icmp -j DROP
  2. iptables -D INPUT 1

需求3: 现在有⼀个ip.txt的⽂件,⾥⾯有很多IP地址。还有⼀个port.txt的⽂件,⾥⾯有很多端⼝号。现在希望对ip.txt的每个IP地址进⾏端⼝的探测,探测的端⼝号来源于port.txt⽂件中,最后将开放的端⼝和IP保存到⼀个ok.txt⽂件。

  1. #ip.txt port.txt
  2. 10.0.0.1 80
  3. 10.0.0.2 22
  4. 10.0.0.3 3306
  5. 10.0.0.4 23
  6. 10.0.0.5 443
  7. 10.0.0.6 9000
  8. 10.0.0.7 123
  9. 10.0.0.8 6379
  10. 10.0.0.9 10050
  11. 172.16.1.5 10051
  12. 192.168.10.1
  13. 172.16.1.6
  14. [root@web01 shell-for]# cat ip.txt
  15. 10.0.0.1
  16. 10.0.0.210.0.0.3
  17. 10.0.0.4
  18. 10.0.0.5
  19. 10.0.0.6
  20. 10.0.0.7
  21. 10.0.0.8
  22. 10.0.0.9
  23. 10.0.0.31
  24. 10.0.0.51
  25. 172.16.1.7
  26. 172.16.1.8
  27. 172.16.1.51
  28. 172.16.1.5
  29. 192.168.10.1
  30. 172.16.1.6
  31. [root@web01 shell-for]# cat port.txt
  32. 80
  33. 22
  34. 3306
  35. 23
  36. 443
  37. 9000
  38. 123
  39. 6379
  40. 10050
  41. 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

1.jpg

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 。

1.txt 2.txt

[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

mysql_backup_table.sh

*需求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