shell脚本编程之语句控制

==============================================================================

概述:


==============================================================================

过程式编程语言的代码执行顺序

顺序执行

  • 按照顺序一条一条语句执行;

选择执行

  • 代码有一个分支:条件满足时才会执行;

  • 两个或以上的分支:只会执行其中一个满足条件的分支;

循环执行

  • 代码片段(循环体)要执行0,1或多个来回

注意:

  • 顺序执行不需要特定的控制,只需按照语句依次执行即可;选择执行,则需要特定的控制语句(如:if,case)来判断执行;循环执行则需要特定的循环控制控制(如:for,while等)。

bash脚本编程之用户交互

在bash脚本编程过程当中有时程序需要与用户之间进行交互(通过键盘输入数据),如提示用户输入一些参数等,此时,我们可以使用read命令来完成此功能  。

read

功能:

  • 和用户进行交互,通过键盘输入数据,从而完成变量赋值工作;

语法:

  • read [option]...[name...]

选项:

  • -p :“说明信息”,指示要显示的提示;

  • -t :TIMEOUT , 多长时间不输入后就退出;

注意:

  • read从标准输入中读取值,给每个单词分配一个变量,所有剩余单词都被分配给最后一个变量

示例:

[root@centos7 ~]# read name
tao
[root@centos7 ~]# echo $name
tao

[root@centos7 ~]# read a b
tom jerry
[root@centos7 ~]# echo $a
tom
[root@centos7 ~]# echo $b
jerry

# 如果给定的参数少于变量个数,那么对应的参数为空的变量将为空
[root@centos7 ~]# read a b c
tom jerry
[root@centos7 ~]# echo $a
tom
[root@centos7 ~]# echo $b
jerry
[root@centos7 ~]# echo $c

# 如果给定的参数多于变量,那么多余的参数都将赋值给最后一个变量
[root@centos7 ~]# read a b c
tao tom jerry xiu
[root@centos7 ~]# echo $a
tao
[root@centos7 ~]# echo $b
tom
[root@centos7 ~]# echo $c
jerry xiu

[root@centos7 ~]# echo -n "Enter a username: ";read name
Enter a username: tao
[root@centos7 ~]# echo $name
tao

[root@centos7 ~]# read -p "Enter a username: " name
Enter a username: tom
[root@centos7 ~]# echo $name
tom


[root@centos7 ~]# read -p "Enter a username: " name
Enter a username: tom
[root@centos7 ~]# [ -z "$name" ] && name="tao"  # 如果变量为空时赋值为tao
[root@centos7 ~]# echo $name
tao

示例脚本

[root@centos7 bin]# cat useradd2.sh 
#!/bin/bash
#

read -p "Enter a username: " name
[[ -z "$name" ]] && echo "a username is needed" && exit 2


if id $name &> /dev/null; then
    echo "$name exits."
else
    read -p "Enter password for $name,[password]: " password
    [[ -z "$password" ]] && password="password"
    useradd $name
    echo "$password" | passwd --stdin $name &> /dev/null
    echo "Add user $name finished"
fi

选择执行

 1.if 语句

语法:

单分支

  if 判断条件;then
     代码分支
  fi

双分支(布尔型条件)

  if 判断条件; then
      条件为真时执行的分支
  else
      条件为假时执行的分支
  fi

多分支

  • 从上而下逐条件进行判断,第一次遇到为“真”条件时,执行其分支,而后结束整个if语句;

  • 即便多个条件可能同时满足,分支也只会执行其中一个,即首先测试为真的那个;

  if   CONDITION1; then
       if-true
  elif CONDITION2; then
       if-ture
  elif CONDITION3; then
       if-ture
   ...
  else
       all-false
  fi

注意:

  • if语句可嵌套(if是一个关键字,不是一个命令。)

示例:

 1.通过参数传递一个用户名给脚本,此用户不存在时,则添加

[root@centos7 bin]# cat useradd1.sh
# 单分支语句
#1/bin/bash
#

if [ $# -lt 1 ]; then
    echo "At lest one username"
    exit 2
fi

if ! grep "^$1\>" /etc/passwd &> /dev/null;then
    useradd $1
    echo $1 |passwd --stdin $1 &> /dev/null
    echo "Add user $1 finished"
fi


#双分支语句
[ $# -lt 1 ] && echo "At lest add username" && exit 1
if  grep "^$1\>" /etc/passwd &> /dev/null;then
    echo "user $1 exits"    
else 
    useradd $1
    echo $1 |passwd --stdin $1 &> /dev/null
    echo "Add user $1 finished"
fi

# 方法二
[[ $# -lt 1 ]] && echo "At lest one username" && exit 2
if id $1 &> /dev/null; then
    echo "user $1 exits"    
else
    useradd $1
    echo $1 |passwd --stdin $1 &> /dev/null
    echo "Add user $1 finished"
fi

2.写一个脚本/root/bin/filetype.sh,判断用户输入文件路径,显示其文件类型(普通,目录,链接,其它文件类型)

[root@centos7 bin]# cat filetype.sh 
#!/bin/bash
#

if [ $# -lt 1 ]; then
	echo "At least one path"
	exit 1
fi

if ! [ -e $1 ]; then
	echo "No such file"
	exit 2
fi

if [ -f $1 ]; then
	echo "Common file"
elif [ -d $1 ]; then
	echo "Directory."
elif [ -b $1 ]; then
	echo "Block special file."
elif [ -c $1 ]; then
    echo "Character special file"
elif [ -s $1 ]; then
	echo "Socket file."
else
	echo "Unknow."
fi

3.根据提示让用户选择输入的信息:cpu,mem,disks,quit,正确就的选择就给出相应的信息,否则就提示重新选择正确的选项

[root@centos7 bin]# cat menu.sh
#!/bin/bash
#

cat << EOF
cpu) display cpu information
mem) diplay men information
disks) display disks information
quit) quit
======================================
EOF

read -p "Enter your option: " option

while [ "$option" != "cpu" -a "$option" != "mem" -a "$option" != "disks" -a "$option" != "quit" ]; do
    echo "cpu mem disks quit"
	read -p "Enter your option again: " option
done

if [ "$option" == "cpu" ];then
	lscpu
elif [ "$option" == "mem" ];then
	free -m
elif [ "$option" == "disks" ];then
	fdisk -l /dev/[hs]d[a-z]
else 
	echo "quit"
	exit 0
fi

 

 2.条件判断case语句

条件判断case语句(主要用于离散值的匹配

使用场景:

  • case 语句在很多场景当中可以替换多分支的 if 语句,显示为更为简洁的格式,但其仅适用于:一个变量与多个取值之间作等值或者模式匹配时才可以用(即:拿一个变量来回跟多个可能的变量取值作比较才能使用或者说是,一个大的变量里面还有许多小的变量要选择才会用到),否则的话,只能用多分支的 if 语句

语法:

   case 变量引量 in
    PAT1)
         分支1
     ;;
    PAT2)
         分支2
     ;;
        ...
    *)
         默认分支
     ;;
    esac

case仅支持glob风格的通配符:

  • *:任意长度任意字符

  • ?:任意单个字符

  • []:指定范围内的任意单个字符[adc](也可以表示范围[1-10])

  • a|b:a或b

示例:

1.根据提示让用户选择输入的信息:cpu,mem,disks,quit,正确就的选择就给出相应的信息,否则就提示重新选择正确的选项

[root@centos7 bin]# cat menu.sh
#!/bin/bash
#

cat << EOF
cpu) display cpu information
mem) diplay men information
disks) display disks information
quit) quit
======================================
EOF

read -p "Enter your option: " option

while [ "$option" != "cpu" -a "$option" != "mem" -a "$option" != "disks" -a "$option" != "quit" ]; do
    echo "cpu mem disks quit"
	read -p "Enter your option again: " option
done

case $option in
cpu)
	lscpu
	;;
mem)
	free -m
	;;
disks)
	fdisk -l /dev/[hs]d[a-z]
	;;
*)
	echo "quit"
	exit 0
	;;
esac

2.写一个服务脚本,

1)支持接受start,stop,restart,status四个参数之一;

2)如果参数非此四值,则提示使用帮助后退出;

3)start则创建lockfile,并启动;stop则删除lockfile,显示停止;restart,则先删除此文件,再创建此文件,而后显示启动完成;status,如果lockfile存在,则显示running,不存在,则显示 stopped

[root@centos7 bin]# cat testservice.sh 
#!/bin/bash
#
#chkconfig: - 50 50
#description: test service scipt
#

prong=$(basename $0)
lockfile=/var/lock/subsys/$prong

case $1 in
start)
	if [ -f $lockfile ];then
		echo "$prong is running yet."
	else
		touch $lockfile
		[ $? -eq 0 ] && echo "start $prong finished."
	fi
	;;
stop)
	if [ -f $lockfile ];then
		rm -f $lockfile
		[ $? -eq 0 ] && echo "stop $prong finished."
	else
		echo "$prong is not running."
	fi
	;;
restart)
	if [ -f $lockfile ];then
		rm -f $lockfile
		echo "stop $prong finished."
		touch $lockfile
        echo "start $prong finished."
	else
		touch $lockfile
		echo "start $prong finished."
	fi
	;;
status)
	if [ -f $lockfile ];then
		echo "$prong is running"
	else
		echo "$prong is stopped"
	fi
	;;
*)
	echo "Usage: $prong {start|stop|restart|status}"
	exit 1
esac

#================================================================================
# 复制到 /etc/init.d/ 目录下:
[root@centos7 bin]# cp testservice /etc/init.d/  
[root@centos7 bin]# ls /etc/init.d/
functions  netconsole  network  README  testservice.sh

# 加入到 SysV 服务中去,使用 service 命令管控
[root@centos7 bin]# chkconfig --add testservice
[root@centos7 bin]# chkconfig --list testservice

注意:该输出结果只显示 SysV 服务,并不包含原生 systemd 服务。SysV 配置数据可能被原生 systemd 配置覆盖。 
      如果您想列出 systemd 服务,请执行 'systemctl list-unit-files'。
      欲查看对特定 target 启用的服务请执行
      'systemctl list-dependencies [target]'。

testservice    	0:关	1:关	2:关	3:关	4:关	5:关	6:关

[root@centos7 bin]# ll /etc/init.d/testservice 
-rw-r--r-- 1 root root 798 3月   2 13:42 /etc/init.d/testservice

# 给脚本一个执行权限
[root@centos7 bin]# chmod +x /etc/init.d/testservice 	

# 服务脚本测试如下
[root@centos7 bin]# service testservice start
start testservice finished.
[root@centos7 bin]# service testservice start
testservice is running yet.
[root@centos7 bin]# service testservice restart
stop testservice finished.
start testservice finished.
[root@centos7 bin]# service testservice stop
stop testservice finished.
[root@centos7 bin]# service testservice restart
start testservice finished.
[root@centos7 bin]# service testservice res
Usage: testservice {start|stop|restart|status}
[root@centos7 bin]# ls /var/lock/subsys/
network  testservice
[root@centos7 bin]# service testservice stop
stop testservice finished.

# 注意:通过服务控制的脚本都会在启动完成后在 /var/lock/subsys/ 下创建一个锁文件
[root@centos7 bin]# service testservice stop
stop testservice finished.
[root@centos7 bin]# ls /var/lock/subsys/
network
[root@centos7 bin]# service testservice status
testservice is stopped
[root@centos7 bin]# service testservice start
start testservice finished.
[root@centos7 bin]# ls /var/lock/subsys/
network  testservice


总结:

总结:

  • if语句在使用过程中,可以实现多重嵌套,这里一定要注意书写的格式,分好层次,不要写乱了;

  • case一般是在拿一个变量来回跟多个可能的变量取值作比较才能使用,才会使用到。一定要注意书写格式,不要写错了

  • 在写脚本的时候不能着急,要构思清新,每一种情况都要考虑到

练习:

 1.写一个脚本/root/bin/createuser.sh,实现如下功能:使用一个用户名做为参数,如果指定参数的用户存在,就显示其存在,否则添加之;显示添加的用户的id号等信息

练习1.png

 2.写一个脚本/root/bin/yesorno.sh,提示用户输入yes或no,并判断用户输入的是yes还是no,或是其它信息

练习2.png

 3.写一个脚本/root/bin/checkint.sh,判断用户输入的参数是否为正整数

练习4.png

循环执行

循环执行:

  • 将一段代码段重复执行0,1或多次

进入条件:

  • 条件满足时才进入循环;

退出条件:

  • 每个循环都应该有退出条件,以有机会退出循环;

bash脚本的循环

  • for 循环;

  • while 循环;

  • until 循环;

 1.for循环

for循环

两种格式:

  • 遍历列表;

  • 控制变量;

遍历列表方式:

语法:

      for VARAIBLE in LIST ;do

             循环体

      done

进入条件:

  • 只要列表有元素,即可进入循环

退出条件:

  • 列表中的元素遍历完成

执行机制:

  • 依次将列表中的元素赋值给“变量名”; 每次赋值后即执行一次循环体; 直到列表中的元素耗尽,循环结束。(遍历列表)

列表生成方式

  • 直接给出列表;

  • 整数列表:

         1){start..end};

         2)$(seq[start [step]] end);step 为步长

  • 返回列表的命令; $(COMMAND)   $() = `` 都是变量引用

  • 使用glob,如:*.sh

  • 变量引用:$@,$*

    ...

示例:

1.求100以内所有正整数之和

#!/bin/bash
#

declare -i sum=0

for i in {1..100};do
	echo "\$sum is $sum, \$i is $i"
	sum=$[$sum+$i]
done

echo $sum

# 执行效果如下:
[root@centos7 bin]# bash sum.sh
$sum is 0, $i is 1
$sum is 1, $i is 2
$sum is 3, $i is 3
$sum is 6, $i is 4
$sum is 10, $i is 5
$sum is 15, $i is 6
$sum is 21, $i is 7
$sum is 28, $i is 8
$sum is 36, $i is 9
$sum is 45, $i is 10
...
5050

# 100 以内所有偶数之和
[root@centos7 bin]# sum=0;for i in `seq 0 2 100`;do sum=$[$sum+$i];done;echo $sum
2550

# 100 以内所有奇数之和
[root@centos7 bin]# sum=0;for i in `seq 1 2 100`;do sum=$[$sum+$i];done;echo $sum
2500

# 求当前系统上所有用户的id之和
[root@centos7 bin]# sum=0;for i in `cut -d: -f3 /etc/passwd`;do sum=$[$sum+$i];done ;echo $sum
80311

2.判断/var/log/目录下所有文件的文件类型:

[root@centos7 bin]# cat filetype1.sh
#!/bin/bash
#

for filename in /var/log/*;do
	if [ -f $filename ]; then
		echo "$filename is  Common file"
	elif [ -d $filename ]; then
		echo "$filename is  Directory."
	elif [ -b $filename ]; then
		echo "$filename is Block special file."
	elif [ -c $filename ]; then
    	echo "$filename is Character special file"
	elif [ -s $filename ]; then
		echo "$filename is Socket file."
	else
		echo "$filename is Unknow."
	fi
done

  2.while循环

语法:

    while CONDITION; do

             循环体

    done

进入条件:

  • CONDITION为true;

退出条件:

  • CONDITION为 false;

CONDITION(循环控制条件):

  • 进入循环之前,先做一次判断;每一次循环之后会再次做判断;条件为“true”,则执行一次循环;直到条件测试状态为“false”终止循环;

  • 因此:CONDTION一般应该有循环控制变量;而此变量的值会在循环体不断地被修正;一般为布尔型表达式

示例:

1.求100以内所有正整数之和。

[root@centos7 bin]# cat sum1.sh
#!/bin/bash
#
declare -i sum=0
declare -i i=1

while [ $i -le 100 ];do
	sum=$[$sum+$i]
	let i++
done

echo $sum

  3.until循环(相当于在wehile控制条件之前加 “!”)

语法:

  until CONDITION; do

         循环体

  done

进入条件:

  • CONDITION为 flase;

退出条件:

  • CONDITION为 true;

示例:

1.求100以内所有正整数之和。

[root@centos7 bin]# cat sum2.sh
#!/bin/bash
#

declare -i sum=0
declare -i i=1

until [ $i -gt 100 ];do
	sum=$[$sum+$i]
	let i++
done

echo $sum

 4.创建无限循环

while 无限循环

 while true;do
     循环体
 done

until 无限循环

  until flase; do
     循环体
  done


 5.循环控制语句

continue [N]:

  • 提前结束第N层的本轮循环,而直接进入下一轮判断;最内层为第1层

    while CONDITION1;DO
        CMD1
        ...
        if CONDITION2;then
             continue
        fi
        CMDn
        ...
    done

break [N]:

  • 提前结束第N层循环,最内层为第1层

示例:

1.求100以内所有偶数之和:

[root@centos7 bin]# cat sum3.sh
#!/bin/bash
#
declare -i sum=0
declare -i i=0

while [ $i -le 100 ];do
	let i++
	if [ $[$i%2] -eq 1 ];then
    	continue
	fi
	sum=$[$sum+$i]
done

echo "sum :" $sum

2.求100以内所有奇数之和

[root@centos7 bin]# cat sum4.sh
#!/bin/bash
#

declare -i sum=1
declare -i i=1

while true; do
	let i+=2
    sum=$[$sum+$i]
	if [ $i -ge 99 ];then
		break
	fi
done

echo $sum

wKiom1e64nfh76lSAAAkCsv5Qlw593.png

wKiom1e65rSwwRxJAAAaq3KeHSg798.pngwKioL1e65tHxdg4gAAAUQ5LP6ak438.png 

wKiom1e65uegobNwAAAgSUd03vI334.png

wKioL1e65ufjHrsmAAAYi2ClEbU940.png


  6.sleep 命令

sleep

用途

  • sleep命令常用于在Linux shell脚本中延迟时间。

语法:

  • sleep NUMBER [SUFFIX]...

SUFFIX(后缀):

  • s:秒, 默认;

  • m:分;

  • h:小时;

  • d:

示例:

[root@centos7 ~]# date;sleep 5;date
2017年 03月 01日 星期三 20:15:01 CST
2017年 03月 01日 星期三 20:15:06 CST
[root@centos7 ~]# date;sleep 1.5m;date
2017年 03月 01日 星期三 20:15:27 CST
2017年 03月 01日 星期三 20:16:57 CST

1.每隔三秒钟到系统上获取已登录的用户信息;其中,如果centos用户登录了系统,则记录于日志中,并退出

[root@centos7 bin]# cat login.sh 
#!/bin/bash
#

while true;do
	if who| grep "^centos\>" &> /dev/null;then
		break
	fi
	sleep 3
done

echo "$(date "+%F %T") centos logged on" >> /tmp/user.log

#===============================================================================

[root@centos7 bin]# cat login1.sh 
#!/bin/bash
#

until who| grep "^centos\>" &> /dev/null;do
	sleep 3
done

echo "$(date "+%F %T") centos logged on" >> /tmp/user.log

循环语句的特殊用法

  1.while循环的特殊用法

while循环的特殊用法(遍历文件的每一行)

语法:

    while read VARIABLE; do

      循环体

   done < /PATH/FROM/SOMEFILE  

意义:

  • 依次读取/PATH/FROM/SOMEFILE文件中的每一行,且将行赋值给变量VARIABLE(一般变量可设置为 line)

示例:

1.找出ID号为偶数的用户,显示其用户名,ID,及默认的shell

[root@centos7 bin]# cat user.sh
#!/bin.bash
#

while read line;do
	userid=$(echo $line|cut -d: -f3)
	username=$(echo $line|cut -d: -f1)
	usershell=$(echo $line|cut -d: -f7)

	if [ $[$userid%2] -eq 0 ];then
		echo "$username,$userid,$usershell"
	fi
done < /etc/passwd

2.扫描/etc/passwd文件每一行,如发现GECOS字段为空,则填充用户名和单位电话为62985600,并提示该用户的GECOS信息修改成功。

[root@centos7 bin]# cat message.sh
#!/bin/bash
#

while read line;do
	string=$(echo $line| cut -d: -f5)
	username=$(echo $line| cut -d: -f1 )
	if [[ -z "$string" ]];then
		chfn -f "$username" $username &> /dev/null
		chfn -p "62985600" $username &> /dev/null
	    echo "$username 用户信息添加完成"
	else
		echo "$username messages exits"
	fi
done < /etc/passwd

 2.for循环的特殊用法

for循环的特殊用法

  • 双小括号方法,即((…))格式,也可以用于算术运算;

  • 双小括号方法也可以使bash Shell实现C语言风格的变量操作;

语法:

       for ((控制变量初始化;条件判断表达式;控制变量的修正表达式))

               循环体

       done

控制变量初始化:

  • 仅在运行到循环代码段时执行一次;

控制变量的修正表达式:

  • 每轮循环结束会先进行控制变量修正运算,而后再做条件判断;

意义:

  • 第一个分号之前相当于变量的一个初始值,只执行一次,然后进行条件判断,满足条件进入循环体,每轮循环结束后会执行修正表达式,然后再做判断,条件满足进入循环体,结束后再做修正,在判断,如此而已...直到条件判断不满足时,就退出循环。实际上,二三分号,是while循环的意思。

示例:

1.给定一个正整数,求之内的所有正整数之和;

[root@centos7 bin]# cat sum5.sh 
#!/bin/bash
#

read -p "Enter a number: " number 
[[ -z "$number" ]] && echo "Need one number" && exit 2

declare -i sum=0

for ((i=0;i<=$number;i++));do
	sum=$[$sum+$i]
done

echo "数字之和为:$sum"

2.打印九九乘法口诀表

[root@centos7 bin]# cat 99.sh
#!/bin/bash
#

for ((i=1;i<=9;i++));do
	for ((j=1;j<=i;j++));do
		echo -e -n "${j}X${i}=$[${j}*${i}]\t"
	done
	echo
done

#效果如下:
[root@centos7 bin]# bash 99.sh
1X1=1	
1X2=2	2X2=4	
1X3=3	2X3=6	3X3=9	
1X4=4	2X4=8	3X4=12	4X4=16	
1X5=5	2X5=10	3X5=15	4X5=20	5X5=25	
1X6=6	2X6=12	3X6=18	4X6=24	5X6=30	6X6=36	
1X7=7	2X7=14	3X7=21	4X7=28	5X7=35	6X7=42	7X7=49	
1X8=8	2X8=16	3X8=24	4X8=32	5X8=40	6X8=48	7X8=56	8X8=64	
1X9=9	2X9=18	3X9=27	4X9=36	5X9=45	6X9=54	7X9=63	8X9=72	9X9=81	




for练习

1.添加10个用户user1-user10,密码同用户名

练习for2.png

2./etc/rc.d/rc3.d目录下分别有多个以K开头和以S开头的文件;分别读取每个文件,以K开头的文件输出为文件加stop,以S开头的文件输出为文件名加start;

        “K34filename stop”

        “S66filename start”

for3.png

3、写一个脚本,提示输入正整数n的值,计算1+2+3+…n的总和

for4.png

4.写一个脚本,提示请输入网络地址,如192.168.0.0,判断输入的网段中主机在线状态

[root@centos7 bin]# cat ping.sh
#!/bin/bash
#authoe:tao
#describtion:给定一个网络地址,并探测此网络中主机的在线状态,并统计出在线主机和离线主机的个数

read -p "请输入您的IP地址: " IP

declare -i i=0
declare -i j=0

address=$(echo $IP |egrep "(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])")
arg3=$(echo $IP |cut -d. -f1-3).

if [[ -z "$IP" ]];then
	echo "At least one IPv4." && exit 1
elif [[ "$IP" == "$address" ]];then
	for arg4 in $(seq 100 110);do
		if ping -c1 -W1 $arg3$arg4 &> /dev/null ;then
			echo -e "$arg3$arg4\tup."
			let i++
		else
			echo -e "$arg3$arg4\tdown."
			let j++
		fi
	done
else
	echo "您输入的格式不正确,请重新输入!" && exit 2
fi

echo "在线主机的个数为:$i"
echo "不在线主机的个数为:$j"

#=================================================================
# 执行结果如下:
[root@centos7 bin]# bash ping.sh 
请输入您的IP地址: 192.168.1.1
192.168.1.100	up.
192.168.1.101	up.
192.168.1.102	up.
192.168.1.103	down.
192.168.1.104	down.
192.168.1.105	down.
192.168.1.106	up.
192.168.1.107	down.
192.168.1.108	down.
192.168.1.109	down.
192.168.1.110	down.
在线主机的个数为:4
不在线主机的个数为:7


5、打印九九乘法表

练习for6.png

6.png




while练习

1.通过ping命令探测172.16.250.1-254范围内的所有主机的在线状态,统计在线主机和离线主机各多少。

while2.png

2.打印九九乘法表

while3.png

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

while4.png

while4-1.png

4.打印国际象棋棋盘

while5.png

while5-1.png

while5-2.png

while5-3.png




until练习

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

until1.png

 2.随机生成10以内的数字,实现猜字游戏,提示比较大或小,相等则退出。

until2.png