2019-11-04 day 60 while循环

day 05 for循环练习

例题1

批量创建用户,用户名oldxu01-100 密码随机(8~12), 然后将创建成功的用户名及密码写入到一个文件中

#1.创建100个用户
for user in aa{1..10}
do

      #2.设定随机密码 (for循环一次,就生成一次)
      pass=$(mkpasswd -l 8)

      #3.创建用户
      useradd $user &>/dev/null
      echo "$pass" | passwd --stdin $user &>/dev/null
    
      #4.保存每次循环的用户名和密码
      echo "$user:$pass" | tee -a  pass.txt
done

例题2

使用case实现批量删除用户。
1.提示用户输入需要删除的用户以及删除的个数。
2.如果用户存在则删除,如果不存在则提示no such user

#! /bin/bash
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

例题3

写一个倒计时脚本

for i in {10..1}
do
    echo -n -e "最后倒计时:   $i \r"
    sleep 1
done

例题4

编写一个上课随机点名脚本

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


###方法2
#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" 同学。

例题5

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

#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

例题6

使用for循环备份mysql库,每个库对应一个sql文件,需要排除没用的。
1.拿到需要的库名称 wordpress jpress zabbix zrlog
2.循环拼接备份命令 mysqldump -uroot -poldxu.com -B zabbix >/mysql/data/zabbix.sql

#!/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    

例题7

使用for嵌套循环实现分库分表备份。
分库: 值得是多个库分开备份.
分表: 一个库中有多个表,将多个分开备份

备份表
mysqldump -u<username> -p<password> dbname tablename1 tablename2... > /path/to/***.sql
mysqldump -uroot -poldxu.com  wordpress  t1 >/mysql/data/wordpress/2019-11-1/t1.sql

1.取出所有的库名称
2.取出库对应的所有表
3.将命令拼接在一起完成备份
[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

while循环

while本质上就是循环
只不过while支持条件测试语句
整数比对
字符串比对
正则比对
文件比对

while读入文件的方式比较的特殊 
    while读入文件按行读取   IFS指定分隔符
    for读入文件按空格读取    IFS指定分隔符

while read  file
do
    echo $file
done < /etc/passwd

循环中的控制语句 ----> for while

exit
break
continue

1.exit,退出整个程序。当脚本碰到exit时,直接退出,剩余不管有多少代码都不执行。
2.break,结束当前循环,但会执行循环之后的所有的代码。
3.continue 忽略本次循环剩余的所有代码,直接进行下一次循环,直到循环结束,然后继续循环之后的代码。

while循环练习题

例题1

使用while读入文件方式,批量创建用户

while read line
do
    id $line &>/dev/null
    if [ $? -eq 0 ];then
        continue
    else
        useradd $line
    fi
done < user.txt
###自行准备user.txt文件,文件内容是要创建的用户名

例题2

使用while读入文件方式,批量创建用户以及密码 文件格式: username:password

while read line
do
    user=$(echo $line | awk -F ":" '{print $1}')
    pass=$(echo $line | awk -F ":" '{print $2}')
    
    id $user &>/dev/null
    if [ $? -eq 0 ];then
        continue
    else
        useradd $user 
        echo "$pass" | passwd --stdin $user
    fi
done <user.txt

例题3

猜数字游戏
1)随机输出一个1-100的数字 echo ((RANDOM%100+1))
2)要求用户输入的必须是数字(数字处加判断)
3)如果比随机数小则提示比随机数小了 大则提示比随机数大了
4)正确则退出 错误则继续死循环
5)最后统计猜了多少次(猜对了多少次,失败多少次)

SJ=$(($RANDOM%100+1))
i=1

while true
do
    read -p "请输入你要猜的数: " Action

    if [ $Action -eq $SJ ];then
        echo "恭喜你 gdx...."
        break

    elif [ $Action -lt $SJ ];then
        echo "太小了 gdx...."
    else
        echo "太大了 gdx...."
    fi
    let i++
done
    echo "你总共猜了 $i 次, 失败了 $(( $i-1 )) 次"

例题4

在一个2000多行数据文件,然后有10个新的文件,1-5行数据放到第一个文件里,6-10行数据 放到第二个文件里...46-50数据放到第10个文件里。然后51-55数据在放到第一个文件里

while true
do
    for i in $(seq 10)
    do
        head -5 file.txt >> file_$i.txt
        sed -i '1,5d' file.txt

        if [ ! -s file.txt ];then
            exit
        fi
    done
done

###方法2
#!/bin/bash
a=0
b=0
while [ $b -lt 2000 ]
do
        file=num.txt
        while [ $a -lt 10 ]
        do
                a=$[$a+1]
                b=$[$b+5]
                echo "$a $b"
                line=$(awk "NR==$[$b-4],NR==$b" $file)
                echo "$line">>${a}.txt
        done
        a=0
done

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,525评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,203评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,862评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,728评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,743评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,590评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,330评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,244评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,693评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,885评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,001评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,723评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,343评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,919评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,042评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,191评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,955评论 2 355

推荐阅读更多精彩内容

  • Zabbix简介 Zabbix官方网站Zabbix中文文档 本文系统环境是CentOS7x86_64, Zabbi...
    Zhang21阅读 8,002评论 0 37
  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,317评论 0 9
  • 一、架构设计及环境规划: 架构设计图: 架构设计说明: 1. 基础架构为LAMP环境,采用keepalived实现...
    Bogon阅读 10,563评论 0 10
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,746评论 0 10
  • zabbix是什么在此就不多作介绍了,可以参考之前的文章零代码如何打造自己的实时监控预警系统,这篇主要介绍安装及注...
    欢醉阅读 1,443评论 0 2