while,shift,until,case

        • while语句
        • 小结
        • shift迁移语句
        • until语句
        • 搭建ftp服务器
        • 在别的机器上监控ftp服务器状态nc命令


脚本趋势:自动化、可视化
编写一个好脚本的要素:

  • 逻辑结构清晰
  • 脚本可以重用
  • 多加入注释

学会调试脚本:

  • echo配合exit命令或sleep命令–》退出脚本|等待几秒继续,默认1s
  • bash -x 脚本–》看到脚本的执行过程
  • read 断点功能

while语句

while 条件
do
    执行动作
done

①例子1:

#!/bin/bash
i=1
while    ((i<=10)) --》while后面可以空格
do
        echo $i
        sleep 0.3
        ((i++))
done

②例2:间接引用

#!/bin/bash
i=1
while ((i<=$#))  --》位置变量的个数
do
    echo ${!i} --》间接引用
    ((i++))
done

执行结果:

这里写图片描述

间接引用:

while,shift,until,case_第1张图片

③while read 文件里的变量名
例3:
user.txt:
这里写图片描述

#cat while3.sh:
#!/bin/bash
while read age name sex address -->变量名
do
        echo -e "$age\t$name\t$sex\t$address"
done 

执行结果:
这里写图片描述

分析:

  • while配合read从文件里取东西的时候,是一行一行的取出。以空白(空格和tab)作为分隔符,再赋值给read后面接的变量,会根据变量的个数一一对应。
  • 如果只有一个变量,就将整行给这个变量,如果有多个变量,变量的数量和分隔出来的字段相等,则一一对应给变量,如果分隔出来的字段大于变量的数量,则将多出来的字段一起给最后一个变量,如果变量的数量超过分隔出来的字段的数量,则多余的变量为空值。

④管道 + while read 变量名 –》也是从文件读取!!
例4:

#!/bin/bash
n=1
cat /etc/passwd|while read line
do
    echo -e "chinaitsoft:\t$n \t$line"
    ((n++))
done

执行结果:

while,shift,until,case_第2张图片

死循环的危害:
主要看死循环里做什么事情

  • 1.消耗cpu –》计算类型
  • 2.磁盘i/o –》dd
  • 3.消耗内存
  • 4.消耗网络带宽 –》不停地下载

⑤死循环消耗cpu、内存的例子:

#cat while4.sh
i=1
while true
do
    echo “$i”
    ((i++))
    bash /lianxi/while4.sh
done

每次产生1个1M大小的文件来消耗内存的例子:

#cat while4.sh
i=1
while true
do
    echo “$i”
    ((i++))
  (dd   if=/dev/zero    of=dd.dd$i    bs=1M   count=1)&
done

--》每次产生11M大小的文件,并且放到后台去运行。

跳出死循环的方法:

  • exit:退出脚本
  • break:跳出循环(for、while、until)

⑤跳出死循环
只有输入end才结束,否则一直在输入状态

#!/bin/bash
while :
do
    read -p "Please input:" str
    if [[ "$str" = "end" ]]
    then
         break
    fi
done

执行结果:

这里写图片描述

小结:

1.while如何控制循环的次数?

  • 读文件时,循环次数看文件里有多少行
  • 定义变量,根据变量的值来控制
while (( i<=10 ))

2.while循环里,死循环的语法有哪几种?怎么跳出死循环?

  • while :
  • while true
  • while [1]

  • break
  • exit

3.循环结束不代表脚本结束!脚本的执行是从上而下执行的!!

练习
每2秒钟输出一次系统时间。
解析:不停输出–》死循环while–》sleep 2–》时间格式:年月日时分秒

答案:

#!/bin/bash
while :
do
        echo $(date +%F'  '%H:%M:%S) >>/lianxi/timeout.txt
        sleep 2
done
[或者:date +'%Y-%m-%d  %H%M%S']

练习2:
用while循环批量添加20个用户,要求:
①用户名称以stu开头,按数字顺序进行编号
②一共添加20个用户,即stu1、stu2……
③初始密码均设置为123456

答案:

#!/bin/bash
a="stu"
i=1
while (( i<=20 ))
do
     useradd $a$i
     echo "123456"|passwd --stdin $a$i &>/dev/null
     (( i++ ))
done

假如用户名在一个文件里,怎么解决?

#!/bin/bash
cat username.txt|while read name pass  --》name pass 叫啥都行
do
    id $name &>/dev/null||useradd $name
    echo "$pass"|passwd $name --stdin &>/dev/null
done
(||:或符号,id命令执行不成功,才执行后面的命令)

练习3:

分析当前主机中所有用户,哪些是普通用户,哪些是系统用户。

分析:
看 passwd文件的UID,uid>500则为普通用户,uid<500则为系统用户,
uid怎么从passwd文件里弄出来,uid>500的用户怎么弄出来,怎么嵌套进循环里。

答案:

#!/bin/bash
cat /etc/passwd|tr ":" " "|while read username x uid gid --》用户名给username变量,x给x变量,uid给uid变量,其他的给gid这个变量,while取出来是一行一行的取出。
do
    if ((uid>500))
    then
            echo "$username is general user."
    elif ((uid==0))
    then
            echo "$username is super user."
    else
            echo "$username is system user."        
    fi
done
(闪烁功能:#echo -e"\e[5;33mHello,Word\e[0m"
而且是显示黄色,并且闪烁)

练习:猜商品价格游戏
猜唐僧的紫金钵价值多少~
①通过变量RANDOM获得价格
②提示用户猜测并记录次数,猜中后退出循环

while,shift,until,case_第3张图片
分析:随机产生价格(1-100),给与提醒,价格高了/低了,记录猜的次数,如果猜的次数大于10次,输出you are bajie;5次,you are wukong;1次,you are rulai。并且猜中后退出循环,没有猜中就一直猜。。

答案:

#!/bin/bash
time=0
a=$((RANDOM%100))
while :
do
    read -p "Please input the price between 1 and 100:" price
    ((time++))
    if ((price==a))
    then
            echo "Bingo!!You guess it!"    
            echo "The time that you guess is :$time"
            break
    elif ((price>a))
    then
            echo "The $price is 高了!!"
    else
            echo "The $price is 低了!!"
    fi
done
if ((time==1))
then
    echo "You are rulai!"
elif ((time<5 && time>1))
then
    echo "You are wukong!!"
elif ((i<=10))
then
    echo "You are bajie!!"
else
    echo "You are loser..."
fi

练习:给登录到当前主机的所有非root用户终端发送一句话:“用户名:Hi,I’m Root!”

答案:

#!/bin/bash
w|tail -n +3|while read user TTY other  --》w命令显示连接到本机的所有用户
do
    if [[ "$user" != "root" ]]
    then
        echo "Hello $user,I am Root!" >/dev/$TTY
    fi
done

执行结果:
另起一个终端,
while,shift,until,case_第4张图片

shift迁移语句

用于迁移位置变量,将 1  9 依次向左传递。
例如,若当前脚本程序获得的位置变量如下:
$1=file1、$2=file2、$3=file3、$4=file4

则执行一次shift命令后,各位置变量为:
$1=file2、$2=file3、$3=file4

再次执行shift命令后,各位置变量为:
$1=file3、$2=file4
(把后面的往前挪。。相当于把前面的挨个删除了)
其实每shift一次,$#位置变量的总数会发生变化,同时会重新排序。

eg:

#!/bin/bash
while (($#>0))
do
    echo "\$ is $1"
    sleep 0.3
    shift
done

执行结果:
这里写图片描述

until语句

until 条件为假
do
    动作
done

(until条件为真时,才结束循环。与while的用法正好不同。)

例:字符串的比较
芝麻开门:直到说出芝麻开门才停,否则一直说“山无棱,天地合,才敢与君绝。”

答案:

#!/bin/bash
until false
do
    read -p "山无棱,天地合,才敢与君绝:" PIN
    if [[ $PIN == "open door" ]]
    then
        echo "your answer is OK!"
        break
    fi
done

执行结果:
while,shift,until,case_第5张图片


搭建ftp服务器:

1.安装软件
#yum install vsftpd
2.启动ftp服务
#service vsftpd restart(centos6版本)
#/bin/systemctl restart vsftpd.service(centos7版本里)
3.查看ftp服务器的状态(在本机上执行)
#service vsftpd status(centos6版本)
#/bin/systemctl status vsftpd.service(centos7版本里)

在别的机器上监控ftp服务器状态(nc命令)

①在监控的机器上安装nc命令
#yum install nc
②在被监控的机器上关闭防火墙,允许访问21号端口
#iptables -F
③#nc -z 172.16.145.188 21 –》只是扫描端口,不发送数据,所以速度快。
若显示 succeeded!,则证明对方的ftp服务是好的。
#echo $? –》通过返回值得到对方ftp服务是否开启
查看端口是否开启:
#lsof -i:21

你可能感兴趣的:(Shell编程基础笔记)