脚本编程之循环:for,while,until

shell中的循环语句一般有:

for   while   until

一、for

    for 变量名 in 列表;do

        循环体

    done

    

    首先将in后list列表的第一个常数或字符串赋值给循环变量,

    然后执行循环体;依次赋值列表中的字段,最后执行done命令后的命令序列。

    list列表生成方式: 

        (1) 直接给出列表    1 2 3

        (2) 整数列表:

            (a) {start..end}     {1..10}

            (b) $(seq [start [step]] end)    `seq 1 10`

        (3) 返回列表的命令 $(COMMAND) 

        (4) 使用glob,如:*.sh

        (5) 变量引用; $@, $*

提示输入正整数n的值,计算1+2+3+…n的 总和

read -p "please enter a positive integer:" n
    for i in $(seq 1 $n 2>/dev/null);do
        let s+=i
    done
done
echo "sum=$s"

   特殊用法:类似C语言for

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

    do

        循环体

    done 

    双小括号:实现C风格变量操作 ((i++)) 

    控制变脸初始化:仅在第一次循环时执行

    控制变量的修正表达式:会在进入下一轮循环前先执行

1到100正整数和for实现

for((i=1;i<=100;i++));do
    let sum+=i
done
echo $sum

二、while

    while CONDITION; do

        循环体

    done 

        条件为真,执行循环;

        条件为假,退出循环。

     直到不符合条件则退出循环

    CONDITION:循环控制条件;进入循环之前,先做一次判断;每次循环后再次判断;

    CONDTION变量的值应为变化的;应该在循环体不断地被修正;创造退出循环的条件

1到100内所有正整数和while实现

i=1
while [ $i -le 100 ];do
    let s=s+i
    let i++
done
echo "$s"

  特殊用法:

    while read line; do

        循环体

    done < /PATH/FROM/SOMEFILE

    依次读取文件中的每一行复制给变量line

扫描/etc/passwd文件每一行,如发现GECOS字段为空,则填 充用户名和单位电话为62985600,

并提示该用户的GECOS信 息修改成功。

while read line ;do
    user=`echo $line|cut -d: -f1`
    gc=`echo $line|cut -d: -f5`
    [ -z $gc ]&>/dev/null && usermod -c "$user 62985600" $user && printf "%-12s %s\n" $user
 "GECOS changed"
done < /etc/passwd
echo finished

三、until

    until CONDITION; do

        循环体

    done

        条件为假,执行循环

        条件为真,退出循环

    直到符合条件退出循环

1到100正整数和until实现

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

循环控制语句:

    一般结合判断语句使用,用于跳过某些指定情况

    1)continue #    #为第几层,最内层为1层 

        提前结束第#层的本轮循环,直接进入#层下一轮判断。

    2)break #    结束#层循环,最内层为1层 

        直接结束#层循环体,#层后续的循环不再执行。

作业:

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

#!/bin/bash
#
echo
until w|cut -d ' ' -f1|grep "hacker" ;do
    let i++
    echo -e "\b\r$i \t `date` \t no hacker"
    sleep 3
done
echo "should logout"|mail -s 'warning' hacker
echo "is here ! ! !"
echo -e "`date` warning! `w|grep "^hacker"`">>/var/log/messages

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

#!/bin/bash
#
n=$[RANDOM%11]
num=a
until [ $num -eq $n ]&>/dev/null;do
    read -p "please enter a numbe [0-10]:" num
    if [ -z $num ] ;then
        continue 2
    elif [[ ! $num =~ 1?[0-9] ]] ;then
        continue 2
    elif [ $num -gt $n ] ;then
        echo "    your number is bigger"
    elif [ $num -lt $n ] ;then
        echo "    your number is smaller!"
    fi
done
echo you hit the number!  $n

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

#!/bin/bash
#zjj
i=0
until [ $i -gt 100 ];do
    let sum+=i
    let i++
done
echo $sum

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

#!/bin/bash
#
i=1
NumUp=0
NumDown=0
echo
until [ $i -gt 254 ];do
    if ping -W1 -c1 10.1.252.$i &>/dev/null ;then
        let NumUp++
        echo -e "\n\t\t 10.1.252.$i  is up  $NumUp"
    else
        let NumDown++
        echo -e "\b\r$NumDown down"
    fi
    let i++
done

5、编写脚本,打印九九乘法表

#!/bin/bash
#
i=1
until [ $i -gt 9 ];do
    j=1
    until [ $j -gt $i ];do
        echo -n -e  "${j}*${i}=$[$i*$j]\t"
        let j++
    done
echo
let i++
done

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

#!/bin/bash
#zjj
i=1
ran=$RANDOM
max=$ran
min=$ran
echo $ran
until [ $i -gt 9 ];do
    ran=$RANDOM
    echo $ran
    if [ $ran -gt $max ];then
        max=$ran
    elif [ $ran -lt $min ];then
        min=$ran
    fi
    let i++
done
echo MAX=$max   MIN=$min

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

#!/bin/bash
#
i=1
row=1
until [ $row -gt 8 ] ;do
column=1
    until [ $column -gt 8 ] ;do
        i=$[$i%2]
        if [ $i -eq 1 ];then
            echo -ne "\033[47m  \033[0m"
        else
            echo -ne "\033[41m  \033[0m"
        fi
        let i++
        let column++
    done
echo
    let row++
    let i++
done

8、打印等腰三角形 (菱形)

#!/bin/bash
#
read -p "enter the number of line:" line
for((i=1;i<=$line;i++))
do
    count=$[2*$i-1]
    sapce=$[$line-$i+1]
    printf "%${sapce}c" ' '
    for((j=1;j<=$count;j++));do
        echo -n "*" 
    done
echo
done
for((i=$[line-1];i>=1;i--))
do
    count=$[2*$i-1]
    sapce=$[$line-$i+1]
    printf "%${sapce}c" ' '
    for((j=1;j<=$count;j++));do
        echo -n "*" 
    done
echo
done

9.安装centos6.7,用centos6.8kernel升级

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

(0)
JasperJasper
上一篇 2016-08-18 10:10
下一篇 2016-08-18 10:10

相关推荐

  • CentOS启动流程及Shell脚本编程练习

    一、请详细描述CentOS系统的启动流程(详细到每个过程系统做了哪些事情) 第一步:POST加电自检 主要实现的功能是检测各个外围硬件设备是否存在而且能够正常运行起来,实现这一自检功能的是固化在主板上的ROM(主要代表为CMOS)芯片上的BIOS(Basic Input/Output System)程序。 第二步:Boot Sequence(选择启动设备以加…

    2017-11-26
  • 8.5-文本处理工具(命令篇)

     1、文件查看命令: cat, tac,rev cat [OPTION]… [FILE]…     -E: 显示行结束符$     -n: 对显示出的每一行进行编号     -A:显…

    Linux干货 2016-08-07
  • N26-第一周作业

    1、描述计算机的组成及其功能。 运算器(对数据进行各种算术运算和逻辑运算,即对数据进行加工处理)、控制器(对程序规定的控制信息进行解释,根据其要求进行控制,调度程序、数据、地址,协调计算机各部分工作及内存与外设的访问)、存储器(存储程序、数据和各种信号、命令等信息,并在需要时提供这些信息)、I/O      …

    Linux干货 2017-01-13
  • 关于大型网站技术演进的思考(六):存储的瓶颈(6)

    原文出处: 夏天的森林  在讲数据库水平拆分时候,我列出了水平拆分数据库需要解决的两个难题,它们分别是主键的设计问题和单表查询的问题,主键问题前文已经做了比较详细的讲述了,但是第二个问题我没有讲述,今天我将会讲讲如何解决数据表被垂直拆分后的单表查询问题。 要解决数据表被水平拆分后的单表查询问题,我们首先要回到问题的源头,我们为什么需要将数…

    2015-03-11
  • linux常用的文件,目录管理命令总结和文件元数据信息含义

    常用的文件管理类命令及其具体用法 1.rmdir删除空目录 -p 递归删除多级空目录 这个命令不能删除非空目录 例如 [root@dxlcentOS ~]# rmdir /tmp/we rmdir: 删除 “/tmp/we” 失败: 目录非空 [root@dxlcentOS ~]# rmdir /tmp/we2 2.mkdir创建目录 常用选项-p 自动递归…

    Linux干货 2017-10-05
  • sed 文本处理工具介绍

    sed简介: 文本处理三剑客之一的sed sed是一种行编辑器,它一次处理一行内容,本身是一个管道命令,对行的数据进行 替换 增加 删除 选取的工作 sed的命令为:sed[opition] ‘script’ inputfile…             &nbs…

    2017-06-24