Shell 编 程 之 until循 环 语 句-20160817

Shell    until   

§·练习题:

1 每隔3秒钟到系统上获取已经登录的用户的信息;如果发现用户hacker登录,则将登录时间和主机记录于日志/var/log/login.log,并提示该用户退出系统

解:解题思路:按照题意该脚本一直无限循环,一直探测用户hacker使用登录,w 命令可以显示当前登录的用户,在通过 grep查找该用户,查找到就提示该用户需要注销下线。

until的循环语句是判断为假就执行循环体,一定要记得不要写反了。

脚本内容如下:

#!/bin/bash
until  false   ; do  #创建until无限循环
until  !  w | grep -o "^hacker" &>/dev/null ; do    #判断hacker如果登录就提示该用户必须下线 
who | grep "^hacker" > /var/log.log &&  echo "Your  must login out" | write hacker
echo "hacker loging ........"
sleep 3
done
 
until   w| grep -o "^hacker"  &>/dev/null  ; do  #判断hacker用户没有登录,就提示该用户没有登录
echo "hacker no login.........."
sleep 3
done
 
done

解:解题思路:根据题意,我们需要写一个无限循环,当用户输入的数字与随机数相等,循序就退出。用户输入的数字大于随机数,提示用户输入的数字大了,,并且让用户重新输入;如果用户输入的数字小于随机数,提示用户输入的数字小了,并且重新输入。

脚本内容如下:

#!/bin/bash
cat << EOF
guess number please input ini number!        #显示一个提示信息
EOF
 
let guess=$[$RANDOM%9+1]  #定义一个guess变量,为随机生成的数字
read  -p  "you guess bumber: " innum  #提示用户输入一个用户猜测的数字
 
until   false ;do  #编写一个无限循环的until
 
until  expr $innum + 100 &>/dev/null ;do
 cat << EOF 
  guess number please input 0 1 2 ... 8 9 10 between  ini number! 
EOF
  
   read  -p  "you guess number: "  innum    #用户输入的不是数字,提示用户输入正确的数字
 
  done
 
 
if [ $innum -eq $guess  ] ;then   #判断用户输入的数字与随机数的是否相等,相等则退出,并显示信息
echo "you guess right "
echo  "Random number is : $guess"
exit 0
elif [ $innum -lt $guess ] ; then  #判断用户输入的数字是否小于随机数,小于提示重新输入,
echo "you guess number is too little"
 read  -p  "you guess number: "  innum
else          #其它信息为用户输入数据大于随机数,提示用户重新输入
 echo "you guess number is too big"
          read  -p  "you guess number: "  innum
fi
 
done

3 编写脚本,求100以内所有正整数之和

解:解题思路:申明一个变量 i在1到100直接循序,把i的值每一次的值加到变量sum中,最后输出sum的 值即可。
脚本内容如下:
#!/bin/bash
let i=1
let sum=0
until  [ $i  -gt 100 ] ;do
sum=$[sum+i]
let i++
done
echo "$sum "

 

1、编写脚本,通过ping命令探测10.1.0.240-254范围内的所有主机的在线状态,统计在线主机和离线主机各多少

解:解题思路申明一个变量i240254直接循环,申明uphost downhost统计在线和离线的主机数量。

通过ping -c1 -W1 10.1.0.$i 返回值判断主机在不在线。

脚本内容如下:
#!/bin/bash
let i=240
let uphost=0
let downhost=0
until [ $i -gt 254 ]; do
 
if ping -c1 -W1 10.1.0.$i &>/dev/null ;then
echo "host 10.1.0.$i is : up"
let uphost++
else 
echo "host 10.1.0.$i is : donw "
let downhost++
fi
let i++
done
echo "up host number is :$uphost"
echo "down host number is :$downhost"

4 编写脚本,打印九九乘法表

解:解题思路:分析99乘法表,一共九行,每行的数量是行数号,如下图。

行为n行,每行为n个算术表达式(每行表达式循环行号的个数)

申明总共行数为:n ,每行循序的个数为m

每行的表达式为:n*1 n*n

[root@Centos7 for_shells]# bash no3_while.sh 
 1*1=1   (第1行,该行1个表达式)
 1*2=2 2*2=4 (第2行,该行2个表达式)
 1*3=3 2*3=6 3*3=9 (第3行,该行3个表达式)
 1*4=4 2*4=8 3*4=12 4*4=16 (第4行,该行4个表达式)
 1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 (第5行,该行5个表达式)
 1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36(第6行,该行6个表达式)
 1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49(第7行,该行7个表达式)
 1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64(第8行,该行8个表达式)
 1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81(第9行,该行9个表达式)

脚本内容如下:

#!/bin/bash
let a=1
while [ $ a -le 9 ]  ; do  #需要循序的行数
let b=1
while [ $b -le $a  ]; do #每行的算术表达式的个数
let sum=$a*$b
    echo -ne  " $b*$a=$sum\t"  #每次显示的表达式的结果
let b++
done
    echo ""
         let a++
done

5 编写脚本,利用变量RANDOM生成10个随机数字,输出这个10数字,并显示其中的最大者和最小者

解:解题思路:让程序开始就生成两个随机数,保存在变量maxmin中,首先比较maxmin的大小,较大值保存在max中,较小值保存在min中,再随机生成的8个变量我们需要使用临时变量ran存储它的数字,让ran与我们的maxmin比较,ranmax大把值给maxranmin小,把值给min,即可实现我们需要的要求。

#!/bin/bash
#
 let i=1
 max=$[$RANDOM]  #生成随机值保存在max中
 min=$[$RANDOM]  #生成随机值保存在min中
 [ $max -lt $min ]&&let linshi=$min&&let min=$max&&let max=$linshi  #比较max与min大小,保证max的值最大
  echo "random number 1 is : $max ."
  echo "random number 2 is : $min . " 
while [ $i -le 8 ] ; do  #循环8次,每次生成一个随机数ran,让ran与max min比较大小。
    ran=$[$RANDOM]
    [ $max -lt $ran ]&& let max=$ran  #ran比max大,max为ran的值,保证max为最大值
    [ $min -gt $ran ]&& let min=$ran  #ran比min小,min为ran的值,保证min为最小值
    let i++
done
echo "======================="
echo "max number is : $max ."
echo "min number is : $min ."

6 编写脚本,实现打印国际象棋棋盘

解:解题思路,国际象棋棋盘为88列,第1格背景色为红(比如),第2格背景色为白,如此交替。

我们打印88列的带背景的空格应该是没有问题的,问题就是如何让它背景颜色可交替下去。

我们观察我们需要打印的棋盘,第一行为奇数行为红色,第二行为偶数行,如此交替。

如果定义一个变量cc2的余数为1时打印红色,为0时打印白色,第一行没有问题,如果我们在每 行的换行的时候让c再加1,那我们第二行也可以遵循c2的余数为1时打印红色,为0时打印白色; 就可以一次循序下去。

1

2

3

4

5

6

7

8

  9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

 

脚本内容如下:
#!/bin/bash
let a=1
let b=1
let c=1
while [ $a -le 8 ] ; do  #行的循序次数
let b=1
    while [ $b -le 8 ] ; do  #列的循序次数
       let yushu=$c%2   #红白交替的余数控制,变量为c
if [ $yushu -eq 1  ] ;then
 echo -e "\033[47m  \033[0m\c"  #
else
echo  -e  "\033[41m  \033[0m\c"
fi
let c++
let b++
    done
 
echo ""    #换行符
let c++    #换行后记得让c再加1
let a++
done

解:解题思路:需要打印的为下图所示,主要有空格和*号组成,主要在于空格和*号的数量,我们分析图形可以得到一些规律:

对于红色部分:(由于我*号用空格隔开了,所以与正常有点不一样,不过通过观察还是可以得出差不多的规律)

如果有7行(n行)

通过规律我们就可以添加我们的空格和*号数量,

黑色部分同理,也可以得出规律

行数(i)

空格数

星数

总行数(n

1

122n-2i

12i-1

7n

2

102n-2i

32i-1

7n

3

82n-2i

52i-1

7n

4

62n-2i

72i-1

7n

5

42n-2i

92i-1

7n

6

22n-2i

112i-1

7n

7

02n-2i

132i-1

7n

 

 

 

* * *

* * * * *

* * * * * * *

* * * * * * * * *

* * * * * * * * * * *

* * * * * * * * * * * * *

* * * * * * * * * * *

* * * * * * * * *

* * * * * * *

* * * * *

* * *

 

#等腰三角形的上半部分

#!/bin/biash
let a=1 
let b=1 
let n=10
for i in `seq 1 $n`;do
        for a in  `seq 1  $[ 2*(n-i) ]` ;do     
                echo -n " "
                let a++ 
        done
 
        for b in `seq 1 $[ 2*i-1 ]`; do
                echo -ne "\033[33m* \033[0m"
                let b++ 
        done
 
        echo " "
        let i++ 
done

 

#等腰三角形的下半部分

let j=1 
let aa=1
let bb=1
let nt=$[n-1]
 
for  j  in  `seq 1 $nt`  ;  do
        for  aa  in   `seq 1  $[ 2*j ]`  ;  do     
                echo  -n " "
                let  aa++ 
        done
 
        for  bb  in  `seq  1  $[ 2*n-2*j-1 ]`  ;  do
                echo -ne "\033[33m* \033[0m"
                let bb++ 
        done
 
        echo " "
        let j++ 
done

8 安装centos6.7,centos6.8kernel升级?(使用rmp命令让系统有两个Linux内核

解:解题思路

rpm可以升级内核文件,不过不建议直接升级内核文件,linux支持多内核并存,建议直接安装内核文件,我们来尝试一下多内核并存。

/etc/grub.conf  #系统启动菜单显示,多个内核会有多个启动选项

uname  -r 查看系统内核版本

/boot/   内核文件存放路径

 

查看现有系统启动菜单配置文件(2.6.32.642

[root@centos68 etc]# cat /etc/grub.conf    #查看启动菜单中内核启动菜单
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          root (hd0,0)
#          kernel /vmlinuz-version ro root=/dev/sda2
#          initrd /initrd-[generic-]version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS 6 (2.6.32-642.el6.x86_64)  #开机启动菜单显示的启动菜单的名称
root (hd0,0)
kernel /vmlinuz-2.6.32-642.el6.x86_64 ro root=UUID=ca4c44c8-1c65-4896-a295-d55e5d5e5c5e rd_NO_LUKS rd_NO_LVM.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-642.el6.x86_64.img

查看现有系统版本(2.6.32.642

[root@centos68 etc]# uname -r  #查看系统版本
2.6.32-642.el6.x86_64

查看现有系统kernel文件(2.6.32.642

[root@centos68 etc]# ll -h /boot/vmlinuz-2.6.32-642.el6.x86_64 
-rwxr-xr-x. 1 root root 4.1M May 11 01:32 /boot/vmlinuz-2.6.32-642.el6.x86_64
[root@centos68 etc]#

 在现有系统上正常安装与升级都不允许安装或升级版本低的内核文件

[root@centos68 ~]# rpm -ivh kernel-2.6.32-431.el6.x86_64.rpm 
Preparing...                ########################################### [100%]
package kernel-2.6.32-642.el6.x86_64 (which is newer than kernel-2.6.32-431.el6.x86_64) is already installed
[root@centos68 ~]# 
 
[root@centos68 ~]# rpm -Uvh kernel-2.6.32-431.el6.x86_64.rpm 
Preparing...                ########################################### [100%]
package kernel-2.6.32-642.el6.x86_64 (which is newer than kernel-2.6.32-431.el6.x86_64) is already installed

 

强制升级后现有系统2.6.32.642 强制升级2.6.32-431

 

[root@centos68 ~]# rpm -Uvh --force  kernel-2.6.32-431.el6.x86_64.rpm  
 Preparing...                ########################################### [100%]
   1:kernel                 ########################################### [100%]
warning:    erase unlink of /lib/modules/2.6.32-642.el6.x86_64/weak-updates failed: No such file or directory
warning:    erase unlink of /lib/modules/2.6.32-642.el6.x86_64/modules.order failed: No such file or directory
warning:    erase unlink of /lib/modules/2.6.32-642.el6.x86_64/modules.networking failed: No such file or directory
warning:    erase unlink of /lib/modules/2.6.32-642.el6.x86_64/modules.modesetting failed: No such file or directory
warning:    erase unlink of /lib/modules/2.6.32-642.el6.x86_64/modules.drm failed: No such file or directory
warning:    erase unlink of /lib/modules/2.6.32-642.el6.x86_64/modules.block failed: No such file or directory
[root@centos68 ~]#

 

 

强制使用2.6.32-431 升级后,查看系统的版本

强制升级后导致系统版本降低(2.6.32-431 )
[root@centos68 ~]# uname -r
2.6.32-431.el6.x86_64

强制升级后导致系统版本降低(2.6.32-431 )(启动菜单中只有2.6.32-431的系统启动菜单)

[root@centos68 ~]# cat /etc/grub.conf 
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          root (hd0,0)
#          kernel /vmlinuz-version ro root=/dev/sda2
#          initrd /initrd-[generic-]version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.32-431.el6.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=UUID=ca4c44c8-1c65-4896-a295-d55e5d5e5c5e rd_NO_LUKS rd_NO_LVM.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-431.el6.x86_64.img
[root@centos68 ~]#

 

在2.6.32-431 系统上安装2.6.32-642的内核后,查看系统的版本

 

[root@centos68 Packages]# rpm -ivh kernel-2.6.32-642.el6.x86_64.rpm 
Preparing...                ########################################### [100%]
   1:kernel                 ########################################### [100%]

查看系统启动菜单(有两个启动菜单,两个菜单都可以正常的启动)

[root@centos68 ~]# cat /etc/grub.conf   #查看到有两个启动菜单
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          root (hd0,0)
#          kernel /vmlinuz-version ro root=/dev/sda2
#          initrd /initrd-[generic-]version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.32-642.el6.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-642.el6.x86_64 ro root=UUID=ca4c44c8-1c65-4896-a295-d55e5d5e5c5e rd_NO_LUKS rd_NO_LVM.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-642.el6.x86_64.img
title CentOS (2.6.32-431.el6.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=UUID=ca4c44c8-1c65-4896-a295-d55e5d5e5c5e rd_NO_LUKS rd_NO_LVM.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-431.el6.x86_64.img
[root@centos68 ~]#


小结:
    1.低版本无法在高版本的系统上安装与升级,强制安装与升级也可以。
    2.升级会覆盖原来的文件系统中的启动菜单。
    3.安装会在原来版本的linux系统在安装一个linux内核,在配置文件中也会写入相应的启动菜单。
    4.由于是同一版本的升级与安装,双内核系统可以正常运行,但是同时只能进入一个系统。至于两个系统有区别和问题需要在后续的过程中测试。

 

 

 

 

 

 

 

 

 

 

 

 

 

原创文章,作者:linux_root,如若转载,请注明出处:http://www.178linux.com/36784

(0)
linux_rootlinux_root
上一篇 2016-08-22
下一篇 2016-08-22

相关推荐

  • 搭建双主模型lpvs的高可用集群

    一、实验要求: 1、基于LVS-DR模型上实践; 2、调度器高可用(双主模型); 二、实验拓扑图: 三、实验步骤: 1、  设置RS (a)设置http主页 Yum install httpd Vim /var/www/html/index.html <h1>172.18.24.3 server 1或者172.18.24.5server…

    2017-05-15
  • 搭建lnmp实现动静分离

    LNMP代表的就是:Linux系统下Nginx+MySQL+PHP这种网站服务器架构。 (nginx主机)web 处理静态内容 172.16.250.149 (fpm server   mariad bserver)处理动态内容 172.16.253.131 以上为两台CentOS7.3主机 试验拓扑图如下:   ==…

    2017-07-22
  • Linux高级磁盘管理-RAID管理

    在冯诺依曼体系机构中,输入输出要存储的外部磁盘I/O能力实在太低,尤其是企业面对高并发的访问量,在系统内部需要大量调度磁盘的上的网页文件资源,这些都会产生大量的I/O,一个磁盘的I/O能力不管如何提升毕竟是有线的,尤其是机械硬盘;同时为了保障业务的连续性,磁盘故障时必须提供冗余能力,面对这样的实际需求环境,RAID技术产生了,通过组织磁盘阵列方式提供I/O,…

    Linux干货 2016-09-06
  • Linux的哲学思想

    Linux的哲学思想 一切皆文件 在linux中所有的一切,都是可以通过ls进行查询的到的,甚至可以说ll查看详细信息时表现形式为文件,所有的设备,所有的文件不论后缀,只是一个单纯文件通过vim可以编辑一切 单一目的的小程序,组合小程序完成复杂任务 在linux中,每一个命令都是对应一个功能,通过不同的参数来完成不同的要求,通过繁多的小的命令来完成大型的要求…

    Linux干货 2016-10-30
  • ansible基础应用

    Ansible基础 ansible是一款自动化运维工具,基于Python开发,实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。 Ansible架构简介 ansible的核心就是ansible平台,ansible是高度模…

    Linux干货 2016-08-22
  • 文件的权限、扩展属性以及facl

    大纲: 一、前言 二、普通权限 三、特殊权限 四、ext文件的扩展属性 五、文件的访问控制列表(facl) 一、前言 linux中常见的权限有读(r)、写(w)、执行(x),还有3个特殊的权限。因此下面就从普通权限开始介绍起 二、普通权限 rwx:读 写 执行 rwxr-xr-x : 读写执行 读_执行 读_执行  (分别对应)属主 属组…

    Linux干货 2015-05-04