day59-day-shell-for

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值