您的位置:首页 > 运维架构 > Shell

day59-day-shell-for

2020-01-14 23:21 274 查看

1.什么是循环
2.什么是for循环
3.for循环语法
4.for练习

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

#!/bin/bash
# Author:      Oldux.com QQ: 552408925
# Date:       2019-10-31
# FileName:   for-11.sh
# URL:         https://www.xuliangwei.com
# Description:

for i in {1..254}
do
{
ip=10.0.0.$i
ping -W1 -c1 $ip &>/dev/null
if [ $? -eq 0 ];then
echo "$ip 存活"
fi
}&
done
wait

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

#!/bin/bash
# Author:      Oldux.com QQ: 552408925
# Date:       2019-10-31
# FileName:   for-11.sh
# URL:         https://www.xuliangwei.com
# Description:

for i in {1..254}
do
{
ip=10.0.0.$i
ping -W1 -c1 $ip &>/dev/null
if [ $? -eq 0 ];then
echo "$ip 存活" >> ok.txt

else
#如果判断第一次不存活,则在进行一次for循环,循环3次
for j in {1..3}
do
ping -W1 -c1 $ip &>/dev/null
if [ $? -eq 0 ];then
echo "$ip 存活" >> ok.txt
else
echo "$ip 不存活" >> err.txt
fi
done
fi
}&
done
wait

需求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@manager for]# cat for-13.sh
#!/bin/bash
# Author:      Oldux.com QQ: 552408925
# Date:       2019-10-31
# FileName:   for-13.sh
# URL:         https://www.xuliangwei.com
# Description:

#遍历文件中的IP地址
for ip in $(cat ip.txt)
do
#第二次循环,遍历文件中的端口号
for port in $(cat port.txt)
do
#探测IP与端口的存活状态
nc -z -w 1 $ip $port &>/dev/null
if [ $? -eq 0 ];then
echo "$ip $port is ok"
fi
done
done

需求4:获取系统的所有用户并输出。效果如下:

This is 2 user: bin
This is 3 user: daemon
This is 4 user: adm
...............
1.怎么获取所有的用户   awk -F ":" '{print $1}'
2.遍历/etc/passwd 这个文件
3.如何让数字的编号进行自增
#!/bin/bash
# Author:      Oldux.com QQ: 552408925
# Date:       2019-10-31
# FileName:   for-14.sh
# URL:         https://www.xuliangwei.com
# Description:

i=1
for user in $(awk -F ":" '{print $1}' /etc/passwd)
do
echo This is ${i} $user
#let i++
i=$[ $i + 1 ]
done

需求5:批量创建100个用户,比如输入oldxu则会创建oldxu001-100。
1.怎么输出001-100 seq -w 1 100

#!/bin/bash
# Author:      Oldux.com QQ: 552408925
# Date:       2019-10-31
# FileName:   for-15.sh
# URL:         https://www.xuliangwei.com
# Description:

for user in $(seq -w 1 100)
do
useradd $1$user
echo "$1$user is ok"
done
#!/bin/bash
# Author:      Oldux.com QQ: 552408925
# Date:       2019-10-31
# FileName:   for-15.sh
# URL:         https://www.xuliangwei.com
# Description:

for user in $(seq -w 1 10)
do
id $1$user &>/dev/null
if [ $? -ne 0 ];then
useradd $1$user
echo "$1$user is ok"
else
#表示结束当前本次的循环,直接开始下一次循环
continue
fi
done

需求6:批量创建用户脚本,需要用户输入创建的用户数量,以及需要用户输入创建的前缀。例如:前缀oldxu,个数10,代表创建oldxu1~oldxu10,总共10个用户。

read -p "请输入你需要创建的前缀: " qz
read -p "请输入你需要创建的数量: " hz
read -p "你要创建的用户是 $qz , 个数是 $hz 你确定要创建吗? [ y | n ] " : Action
case $Action in
y|yes|Y)
for number in $(seq $hz)
do
username=$qz$number
id $username &>/dev/null
if [ $? -ne 0 ];then
useradd $username
echo "$username is ok"
else
#表示结束当前本次的循环,直接开始下一次循环
continue
fi
done
;;
n|no|N)
echo "Bey!"
exit
;;
*)
echo "Gdx"
exit
esac

需求7:批量创建用户脚本,需要用户输入创建的用户数量(必须是整数),同时还需要用户输入前缀(前缀不能为空)。
例如:前缀oldxu,个数10,代表创建oldxu1~oldxu10,总共10个用户。

[root@manager for]# cat useradd-new.sh
#!/usr/bin/bash

read -p "请输入你需要创建的前缀: " qz
if [ -z $qz ];then
echo "回车做什么  gdx...."
exit
fi

read -p "请输入你需要创建的数量: " hz
if [[ ! $hz =~ ^[0-9]+$ ]];then
echo "让你输数字,,,,emm"
exit
fi
read -p "你要创建的用户是 $qz , 个数是 $hz 你确定要创建吗? [ y | n ] "  Action
case $Action in
y|yes|Y)
for number in $(seq $hz)
do
username=$qz$number
id $username &>/dev/null
if [ $? -ne 0 ];then
useradd $username
echo "$username is ok"
else
#表示结束当前本次的循环,直接开始下一次循环
continue
fi
done
;;
n|no|N)
echo "Bey!"
exit
;;
*)
echo "Gdx"
exit
esac

需求8:循环批量创建用户,需要填入用户的数量、用户的前缀、用户的统一密码(使用read、case、for语句)

#!/usr/bin/bash

read -p "请输入你需要创建的前缀: " qz
if [ -z $qz ];then
echo "回车做什么  gdx...."
exit
fi

read -p "请输入你需要创建的数量: " hz
if [[ ! $hz =~ ^[0-9]+$ ]];then
echo "让你输数字,,,,emm"
exit
fi

read -p "请输入所有用户统一的密码: " pw

read -p "你要创建的用户是 $qz , 个数是 $hz  密码是 $pw 你确定要创建吗? [ y | n ] "  Action
case $Action in
y|yes|Y)
for number in $(seq $hz)
do
username=$qz$number
id $username &>/dev/null
if [ $? -ne 0 ];then
useradd $username
echo "$pw" | passwd --stdin $username
echo "$username $pw is create ok"
else
#表示结束当前本次的循环,直接开始下一次循环
continue
fi
done
;;
n|no|N)
echo "Bey!"
exit
;;
*)
echo "Gdx"
exit
esac

需求9:通过读入文件中的用户,进行批量添加用户。

#!/bin/bash
# Author:      Oldux.com QQ: 552408925
# Date:       2019-10-31
# FileName:   user-file.sh
# URL:         https://www.xuliangwei.com
# Description:

for user in $(cat user.txt)
do
useradd $user

done

需求10:通过读入文件中的用户与密码文件,进行批量添加用户。文件中的格式: user:passwd

#!/bin/bash
# Author:      Oldux.com QQ: 552408925
# Date:       2019-10-31
# FileName:   user-file.sh
# URL:         https://www.xuliangwei.com
# Description:

for user in $(cat user.txt)
do
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: 批量创建用户,用户名oldxu01-100 密码随机(8~12), 然后将创建成功的用户名及密码写入到一个文件中.
mkpasswd -l

oldxu01:dasd1#!@#!@dsa
oldxu02:dascxasdas1!@#

[root@manager-61 ~/for]#cat for19.sh
#!/bin/bash
#*********************
#Author: 流星花雨
#QQ: 1679338722
#Date: 2019-10-31
#FileName: for19.sh
#URL: https://www.leitiancheng.cn
#Description: The test script
#*********************
read -p "请输入用户名: " Action
if [ -z $Action ];then
echo "请不要输入空值"
exit
elif [[ ! "$Action" =~ ^[a-Z]+$ ]];then
echo "请输入以字母开头的 [ a-Z ]"
exit
elif [ ${#Action} -ge 6 ];then
echo "用户名长度不能超过6位"
exit
fi
read -p "请输入创建的随机密码位数 " Num
if [ $Num -lt 8 ];then
echo 随机密码长度至少8位
exit
fi
for i in {1..10}
do

Pass=$(mkpasswd -l 8 )
id $Action$i >/dev/null
if [ $? -ne 0 ];then
useradd $Action$i
echo $Action$i 创建成功
echo $Pass |passwd --stdin $Action$i >/dev/null
echo $Action$i:$Pass >>ltc.txt
else
echo "$Action$i 用户已存在"
continue
fi

echo 1
done

需求12:使用case实现批量删除用户。

[root@manager-61 ~/for]#cat for21.sh
#!/bin/bash
#*********************
#Author: 流星花雨
#QQ: 1679338722
#Date: 2019-10-31
#FileName: for21.sh
#URL: https://www.leitiancheng.cn
#Description: The test script
#*********************
read -p "请输入要删除用户名前缀 " Action
awk -F ":" '{print $1}' /etc/passwd | grep $Action > userdel.txt
for i in $(cat userdel.txt )
do

userdel -r $i
done
1.提示用户输入需要删除的用户以及删除的个数。
2.如果用户存在则删除,如果不存在则提示no such user。
[root@manager for]# cat for-18.sh
#!/bin/bash
# Author:      Oldux.com QQ: 552408925
# Date:       2019-11-01
# FileName:   for-18.sh
# URL:         https://www.xuliangwei.com
# Description:
read -p "请输入删除的用户: " qz
read -p "请输入删除的个数: " hz
read -p "是否要删除: [ y | n ]" Action

case $Action in
y)
for user in $(seq $hz)
do
username=$qz$user
id $username &>/dev/null
if [ $? -eq 0 ];then
userdel -r $username
echo "$username is delete....."
else
echo "$username no such user ....."
continue
fi
done
;;
n)
exit
;;
*)
exit
esac

需求13:查看当前系统已使用内存的百分比,如果以使用的内存占比超过50%则将后台运行的服务列出来,并让用户选择保持不变或者关掉某个服务,后再次显示使用内存的百分比,若还超过50%,则重复上述操作

[root@manager-61 ~/for]#cat for23.sh
#!/bin/bash
#*********************
#Author: 流星花雨
#QQ: 1679338722
#Date: 2019-11-01
#FileName: for23.sh
#URL: https://www.leitiancheng.cn
#Description: The test script
#*********************
a=$(free -m |awk '/Mem:/ {print $3/$2*100}')
while [ ${a%.*} -gt 10 ]
do
clear
echo "当前内存使用率为 $a %已超过80%"
read -p "是否选择关闭一个服务 [ y | n ]" i
case $i in
y)
pidstat

esac
done

需求14:使用for循环备份mysql库,每个库对应一个sql文件,需要排除没用的。
1.如何拿到所有的库名称 wordpress jpress zabbix zrlog
2.拿到后一个一个备份

[root@db01 ~]# cat for-mysql.sh
#!/usr/bin/bash

db_path=/backup/mysql
date_time=$(date +%F)
db_name=$(mysql -uroot  -e  "show databases;" |sed 1d|egrep -v "*_schema|mysql|test")

[ -d $db_path ] || mkdir $db_path -p

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 done....."
else
echo "$i backup is error...."
fi
done
#保留最近180天的数据
find $db_path -type f -mtime +180 -delete | xargs rm -rf

需求15:使用for嵌套循环实现分库分表备份。

[root@db01 ~]# cat for-mysql-tables.sh
#!/usr/bin/bash
db_path=/backup/mysql
date_time=$(date +%F)
db_name=$(mysql -uroot  -e  "show databases;" |sed 1d|egrep -v "*_schema|mysql|test")

#准备备份的目录
[ -d $db_path ] || mkdir $db_path -p

#1.获取所有的库名称
for i in $db_name
do
#1.获取对应库的所有表
db_table=$(mysql -uroot -e "use $i; show tables;"|sed 1d)
for j in $db_table
do
[ -d $db_path/$i/$date_time ] || mkdir $db_path/$i/$date_time -p
mysqldump -uroot $i $j >$db_path/$i/$date_time/${j}.sql
done
done

需求16:编写一个上课随机点名脚本。

[root@manager-61 ~/for]#cat for20.sh
#!/bin/bash
#*********************
#Author: 流星花雨
#QQ: 1679338722
#Date: 2019-10-31
#FileName: for20.sh
#URL: https://www.leitiancheng.cn
#Description: The test script
#*********************
if [ -s Name.txt ];then
User=$(sort --random-sort Name.txt |awk 'NR==1')
echo  $User
grep $User Name.txt >>Name1.txt
grep -v $User Name.txt >Name.t
cat Name.t >Name.txt
else
cat Name1.txt >Name.txt
rm -rf Name1.txt
fi
[root@manager for]# cat for-20.sh
#!/bin/bash
# Author:      Oldux.com QQ: 552408925
# Date:       2019-11-01
# FileName:   for-20.sh
# URL:         https://www.xuliangwei.com
# Description:
if [ -s name.txt ];then
User=$(sort --random-sort name.txt |awk 'NR==1')
echo "$User"

grep $User name.txt >> name1.txt
sed -i '/'$User'/d' name.txt

else
cat name1.txt>name.txt
rm -rf name1.txt
fi
[root@manager for]# cat for-23.sh
#!/bin/bash
# Author:      Oldux.com QQ: 552408925
# Date:       2019-11-01
# FileName:   for-23.sh
# URL:         https://www.xuliangwei.com
# Description:

#1.只循环20次
for i in {1..20}
do
#统计一下名单中的行号
line=$(cat name.txt|wc -l)

#设定一个随机的变量值,但这个值不能超过文件名单的行号
sj=$(( ${RANDOM}%$line+1 ))

# 循环20次,打印20次名单
echo  -e "  $(sed -n "${sj}p" name.txt) "
sleep 0.1

done
sj=$(( $sj + 1 ))
username=$(sed -n "${sj}p"  name.txt)
echo -e 这次回答问题的是: "\033[32m $username \033[0m" 同学。

需求16:抓取https://mirrors.aliyun.com/zabbix/zabbix/4.0/rhel/7/x86_64/页面中的所有rpm包至本地

[root@manager for]# cat for-24.sh
#!/bin/bash
# Author:      Oldux.com QQ: 552408925
# Date:       2019-11-01
# FileName:   for-24.sh
# URL:         https://www.xuliangwei.com
# Description:
#
#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

需求17: 写一个倒计时脚本.

#!/bin/bash
# Author:      Oldux.com QQ: 552408925
# Date:       2019-10-31
# FileName:   for-16.sh
# URL:         https://www.xuliangwei.com
# Description:

for i in {9..1}
do
echo -n -e "$i\b"
sleep 1
done
  • 点赞
  • 收藏
  • 分享
  • 文章举报
站内首发文章 流行花娪 发布了47 篇原创文章 · 获赞 0 · 访问量 279 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: