day60-day-shell-while

while

1.while本质上就是循环

只不过while支持条件测试语句
整数比对
字符串比对
正则比对
文件比对

2.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 忽略本次循环剩余的所有代码,直接进行下一次循环,直到循环结束,然后继续循环之后的代码。

需求:循环嵌套continue,打印1-9当数值为5则跳过本次循环,继续下一次循环。请分别使用for和while实现。
需求2:循环嵌套break,打印1-9当数值为5则停止。请分别使用for和while实现。

需求1: 使用while读入文件方式,批量创建用户

[root@manager while]# cat while-12.sh 
#!/bin/bash
# Author:      Oldux.com QQ: 552408925
# Date:       2019-11-01
# FileName:   while-12.sh
# URL:         https://www.xuliangwei.com
# Description: 

while read line
do
    id $line &>/dev/null
    if [ $? -eq 0 ];then
        continue
    else
        useradd $line
    fi
done < user.txt

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

[root@manager while]# cat while-13.sh 
#!/bin/bash
# Author:      Oldux.com QQ: 552408925
# Date:       2019-11-01
# FileName:   while-13.sh
# URL:         https://www.xuliangwei.com
# Description: 

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 

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

[root@manager while]# cat while-14.sh 
#!/bin/bash
# Author:      Oldux.com QQ: 552408925
# Date:       2019-11-01
# FileName:   while-14.sh
# URL:         https://www.xuliangwei.com
# Description: 

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数据在放到第一个文件里。如何实现?【可忽略】

[root@manager while]# cat while-15.sh 
#!/bin/bash
# Author:      Oldux.com QQ: 552408925
# Date:       2019-11-01
# FileName:   while-15.sh
# URL:         https://www.xuliangwei.com
# Description: 

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


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


1.按照时间生成文件2018-05-22.log将每天的磁盘使用状态写入到对应日期的文件

2.统计Nginx日志中每个IP的访问量有多少,日志如下:
192.168.56.1 - - [21/May/2018:20:44:06 -0400] "GET /index.html HTTP/1.0" 404 169 "-" "ApacheBench/2.3" "-"/code/index.html

3.写一个脚本计算一下Linux系统所有进程占用内存大小的和。

4.在/backup下创建10个.txt的文件,找到/backup目录下所有后缀名为.txt的文件

[root@manager-61 /work]#vim work4.sh

  1 #!/bin/bash
  2 #*********************
  3 #Author: 流星花雨
  4 #QQ: 1679338722
  5 #Date: 2019-11-02
  6 #FileName: work4.sh
  7 #URL: https://www.leitiancheng.cn
  8 #Description: The test script
  9 #*********************
 10 
 11 while  [ $i -le 10 ]
 12 do
 13         touch /backup/$i.txt
 14         #rm -rf /backup/$i.txt
 15         let i++ 
 16     
 17 done
1.批量修改txt为txt.bak
  file=$(find /backup/ -type f -name "*.txt")
  for i in $file
  do
  #echo $i
          mv $i $i.bak 
 done
2.把所有的.bak文件打包压缩为123.tar.gz
 cd /backup/ && tar czf 123.tar.gz ./*.bak 
 rm -rf /backup/*.bak
    3.批量还原文件的名字,及把增加的.bak再删除
    tar xf /backup/123.tar.gz -C /backup/
    Find=$(find /backup/ -type f -name "*.bak")
for l in $Find
do
    mv $l ${l%.*}
done

5.把一个文本文档的前五行中包含字母的行删除掉,同时把6到10行中的全部字母删除掉

nu=$(wc -l file.txt |awk '{print $1}')
for i in $(seq 1 5)
do
    l=$(sed -n ${i}p file.txt)
    if echo $l |grep -Evq [a-Z];then
        echo $l
    
    fi
done
for i in $(seq 6 10)
do
    k=$(sed -n ${i}p file.txt)
        echo $k|sed 's#[a-Z]##g'
        
done
for i in $(seq 11 $nu)
do
    sed -n ${i}p file.txt
done

7.写个shell,看看你的linux系统中是否有自定义用户(普通用户),若是有,一共有几个?

[root@manager-61 /work]#cat work6.sh 
#!/bin/bash
#*********************
#Author: 流星花雨
#QQ: 1679338722
#Date: 2019-11-02
#FileName: work6.sh
#URL: https://www.leitiancheng.cn
#Description: The test script
#*********************
Uid=$(awk -F ":" '{print $3}' /etc/passwd)
for i in $Uid
do
if [ $i -ge 1000 ];then
    echo $i >>user.txt
fi
done
nu=$(wc -l user.txt| awk  '{print $1}')
echo $nu
rm -rf user.txt

8.写一个shell脚本来看看你使用最多的命令是哪些,列出你最常用的命令top10
history |awk '{print $2}'|sort|uniq -c|sort -nr|head
9.中企动力面试题
用shell处理以下内容
1、按单词出现频率降序排序!

declare -A array_txt
txt="the squid project provides a number of resources toassist users design,implement and support squid installations. Please browsethe documentation and support sections for more infomation"
txt=$(echo $txt |sed 's#[.,]# #g')
for i in $txt
do
    let array_txt[$i]++
done
#循环数组
for j in ${!array_txt[@]}
do
    echo 次数是: "${array_txt[$j]}"    索引是: "$j"|sort -t ":" -k2|sort -nr
done

2、按字母出现频率降序排序!

the squid project provides a number of resources toassist users design,implement and support squid installations. Please browsethe documentation and support sections for more infomation

declare -A array_txt
te () {
txt="the squid project provides a number of resources toassist users design,implement and support squid installations. Please browsethe documentation and support sections for more infomation"
txt=$(echo $txt |grep -o [a-Z])
for i in $txt
do
    let array_txt[$i]++
done
#循环数组
for j in ${!array_txt[@]}
do
    echo 次数是: "${array_txt[$j]}"    索引是: "$j"|sort -t ":" -k2
done
}
te|sort -t ":" -k2 -nr

10.写一个脚本,实现判断10.0.0.0/24网络里,当前在线用户的IP有哪些

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

    函数、

需求3:使用case实现系统管理工具箱。
Command action
h 显示命令帮助
f 显示磁盘分区
d 显示磁盘挂载
m 查看内存使用
u 查看系统负载
q 退出程序


cat << -EOF
h 显示命令帮助
f 显示磁盘分区
d 显示磁盘挂载
m 查看内存使用
u 查看系统负载
q 退出程序
-EOF
read -p "请输入相应的指令: [ h | f | d | m | u | q ]" i
case $i in
    h)
        clear
        man cat
        ;;
    f)
        clear
        fdisk -l
        ;;
    d)
        clear
        
        df -h
        ;;
    m)
        clear
        free -m
        ;;
    u)
        clear
        top
        ;;
    q)
        exit
        ;;
    *)
        echo 回车好玩吗
esac

需求3:使用case、循环、函数、实现JumpServer跳板机功能。
1.用户登陆该服务器则自动执行该脚本。
2.脚本提示可连接主机列表。
3.该脚本无法直接退出。

5.case场景示例,实现多级菜单功能。

[root@manager-61 /work]#cat work12.sh
#!/bin/bash
#*********************
#Author: 流星花雨
#QQ: 1679338722
#Date: 2019-11-03
#FileName: work12.sh
#URL: https://www.leitiancheng.cn
#Description: The test script
#*********************
while true
do
cat << -EOF
1 nginx
2 php
3 httpd
4 nfsd
5 vsftpd
6 quit
-EOF
read -p "请输入要操作的服务 [ 1 | 2 | 3 | 4 | 5 | 6 ]" server
case $server in
    1|nginx|Nginx|NGINX)
        clear
        cat << EOF
        ---------------
        1 nginx-1.14
        2 nginx-1.12
        3 nginx-1.10
        4 返回上一层
        --------------
EOF
        
        read -p "请输入你要安装的大版本号 [ 1 | 2 | 3 | 4 ]" b

        case $b in 
            1)
                echo nginx-1.14 已安装
                ;;
            2)
                echo nginx-1.12已安装
                ;;
            3)
                echo nginx-10已安装
                ;;
            4)
                #cat << -EOF
                                #1 nginx
                #2 php
                #3 httpd
                #4 nfsd
                #5 vsftpd
                #6 quit
-EOF
                #read -p "请输入要操作的服务 [ 1 | 2 | 3 | 4 | 5 | 6 ]" server
                continue
                ;;

            *)
            exit
        esac
        ;;
    2|php|Php|PHP)
        
        cat <

你可能感兴趣的:(day60-day-shell-while)