bash shell 循环语句的使用

条件选择if语句

      if语句是选择执行的,条件满足则执行,不满足则退出,if语句也可嵌套,就是if语句里面也可以在进行if语句

单分支

if 判断条件;then

statement1

fi

 

双分支

if 判断条件;then

条件为真得分支

else

条件为假的分支

fi

 

多分支语句

if 判断条件1then

if-true

elif 判断条件2then

if-true

elif 判断条件3then

if true

中间省略

else

all-false

fi

逐一对条件进行判断,第一次遇到为真的条件时,执行其分支,而后结束真个if语句

 

条件判断:case语句

case  变量引用 in

pattern1)

分支1

;;

pattern2)

分支2

;;

……

*

默认分支

;;

esac

注意:每个分之后必须要跟两个分号,结束符是case的反写也就是esaccase也支持glob风格的通配符 *:任意长度的任意字符,?:任意单个字符,[]:指定范围内的任意单个字符

a|bab

 

示例

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

    使用if的双分支语句来判断用户是否存在,如果存在就不执行添加用户,反之,则添加,并显示信息

#!/bin/bash

#

read -p "please input a username :" User

        if [ id -u $User &>/dev/null ] ; then

         echo "$User is exists…"

    else

         useradd $User

         id $User

fi

1.jpg

 

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

这里使用到的是case语句,用户输入yes或no返回相应的信息,这里需要考虑脚本的健壮性,yes或no需要大小写随机组合也可以使Y|y|N|n等返回信息,这里可以使用通配符,但还有一种更简单的方法,就是使用tr命令将用户输入的不管大写小写,统统转换成小写即可

#!/bin/bash

#

read -p "please input (yes |no) :" A

case $A in

[yY]|[yY][eE][Ss])

echo "The user input a $A"

 ;;

[nN]|[[nN][oO])

echo  "The user input  a  $A"

  ;;

*)

echo "The user input other message" ;;

esac

#!/bin/bash

#

read -p "please input (yes |no) :" A

case $A in

echo $A |tr 'A-Z'  'a-z'

y|yes)

echo "The user input a $A"

 ;;

n|no)

echo  "The user input  a  $A"

  ;;

*)

echo "The user input other message" ;;

esac

    

2.jpg   

 

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

判断文件类型的前提是文件或目录需要事先存在,首先就要判断文件存在与否,存在则往下执行,否则退出

    #!/bin/bash

    #

    read -p "please input a filepath:"  File

    [ ! -e $File ] && echo "$File is not exist " && exit 4

    if [ -d $File ] ; then

             echo "$File is a directory"

    elif [ -h $File ] ;then

             echo "$File is a link file "

    elif [ -f $File ] ;then

             echo "$File is a common file"

    else

             echo "$File is  the other file…"

    fi

        3.jpg

 

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

使用变量来匹配字符串,匹配是否是属于正整数当中的某个数字,符合则显示为正整数,否则显示不是

    #!/bin/bash

    #

    read -p "please input a number: "  Num

    if [[ "$Num" =~ ^[1-9][0-9]*$ ]] ;then

         echo "The Num is a integer"

    else

         echo " The Num is not a integer"

    fi

    4.jpg

 

    5、判断用户user是否存在,如果不在将其创建

    if id user1&>/dev/null ;then

            echo “user1 is exists..”

    else

            useradd user1

    fi

        5.jpg

 

 

 

循环

  将某代码重复执行多少次,重复运行多少次,循环次数事先已知,循环次数实现未知,有进入条件和退出条件

 

shell的循环语句有如下几种:

for循环

for 变量名  in  列表 do

循环体

done

 

执行机制:依次将列表中的元素赋值给“变量名”,每次复制后执行一次循环体;知道列表中的元素耗尽,循环结束

列表生成方式

直接给出列表

整数列表 {start..end}$(seq [start  [stop]  end]起始值,步径,结束值

返回列表的命令$(command)

使用glob,如:*.sh

变量引用:

$@,$*(两者的区别在使用引号时,前者表示的不是一个整体,后者表示所有的位置变量是一个整体)

 

while

while 条件判断;do

循环体

done

条件判断:循环控制条件;进入循环之前,先做一次判断;每一次循环之后会再次做判断;条件为true,则执行一次循环;知道条件测试状态为false终止循环,因此条件判断一般有循环控制变量;而此变量的值会在循环体不断被修正

进入条件:判断条件为true

退出条件:判断条件为false

 

until

until 条件判断;do

循环体

done

进入条件:判断条件 false,刚好跟forwhile相反

退出条件:判断条件为true

 

 

示例:

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

#!/bin/bash

for i in `ls /etc/rc.d/rc3.d/`  ;  do

    if [[ $i =~ ^S.* ]] ;then

            echo  “$i start”

    elif [[ $=~^K.* ]] ; then

            echo “$i stop “

    else

            echo “unknow file”

    fi

done

        5.jpg

 

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

方法一:使用for循环

    #!/bin/bash

    declare i=1

    declare -i sum=0

    read –p “please input a number:’ Num

        for i in  [ 1  $Num ] ; do

                let sum+=$i

        done

        echo $sum

 

方法二:使用while循环

    #!/bin/bash

    #

    declare –i sum=0

    declare –I i=1

    whle  [ $i –le 100 ];do

            let sum+=$i

            let i++

    done

    echo “The sum is $sum”

 

方法三:使用until循环

    #!/bin/bash

    #

    declare –i i=0

    until [ $i –gt 100 ] ;do

            let sum+=$i

            let i++

   done

   echo “The sum is $sum”

 6.jpg

 

 

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

方法一:使用for循环

    #!/bin/bash

    #

    read –p “please input a ipv4 address: “ IP

    A=`echo $IP |cut  -d . –f1-3`

    for I in {1..255}

    if ping  -c1 –W1 $A.$i  &>/dev/null; then

            echo “$A.$i is up “

            let up++     #计算能ping通的主机数量

    else

            echo “$A.$i is down”

            let down++   #计算不能ping通的主机数量

    fi

done

echo  “The host $A.$i  has  $up  up”

echo  “The host $A.$i  has  $down  down”

方法二:使用while循环

    #!/bin/bash

    #

    declare –I i=0

    while [ $i –le 254 ];do

        if ping  -c1 –W1 10.1.252.$i  &>/dev/null ;then

                echo “10.1.252.$i is up “

                let up++

        else

                echo “10.1.252.$i is down “

                let down ++

        fi

                let i++

done

echo  “The host $A.$i  has  $up  up”

echo  “The host $A.$i  has  $down  down”

 方法三:使用until循环

    #!/bin/bash

    #

    declare –I i=0

    until [ $i –gt 254 ];do

        if ping  -c1 –W1 10.1.252.$i  &>/dev/null ;then

                echo “10.1.252.$i is up “

                let up++

       else

                echo “10.1.252.$i is down “

                let down ++

       fi

                let i++

done

echo  “The host 10.1.252.$i  has  $up  up”

echo  “The host 10.1.252.$i  has  $down  down”

 7.jpg

 

4、  打印九九乘法表

使用循环依次打印,首先得有9行,定义一个变量取值范围的1-9,然后就是列,找出99乘法表的规律,比如我行的初始值是1,那么我第一列只打印一个公式,列的取值范围是小于行的数,依次循环,当我行的值8是,那么我的列的取值范围也是1-8,内循环,从1*8,内部循环第一结束之后,列的数依次加一循环,当列的值大于行的值时,就退出内部循环,行的值再来加一,一直加到行的值大于9就停止循环

方法一:使用for循环

 for循环实现

    #!/bin/bash

    #

    for i in {1..9};do

            for a in  $(seq 1 $i) ;do

            echo –en “${a}x${i}=$[a*i]\t”

            done

    echo

    done

 

方法二:使用while循环

    #!/bin/bash

    #

    declare –I i=1

    while [ $i –le 9 ];do

    declare –I a=1

            while [ $a –le $i ];do

                echo -ne "${a}x${i}=$[a*i]\t"

                let a++

        done

    echo

                let i++

    done

 

方法三:使用until循环

    #!/bin/bash

    #

    declare –I i=1

    until [ $i –gt 9 ];do

    declare –I a=1

            until [ $a –gt $i ];do

            echo -ne "${a}x${i}=$[a*i]\t"

                let a++

        done

        echo

                let i++

    done

 8.jpg

 

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

首先定义最大值和最小值相等,之后随即生成一个数字,将最大值与随机数作比较,如果随机数大于最大值,将随机数的值赋给最大值,那么最小值也是如此,将最小值与随机数作比较,如果随机数的值小于最小值,将随机数的值赋给最小值,最终最大值和最小值也就出来了

    #!/bin/bash

    #

    max=$RANDOM

    min=$max

    for I in {1..10};do

    rdm=$RANDOM

    echo –ne “$rdm\t”

        if [ $rdm –gt $max ] ; then

                max=$rdm

        elif [ $rdm –lt $min ] ;then

                min=$rdm

        fi

    done

    echo

    echo “The max number is $max”

    echo “The min number is $min”

 

方法二:使用while循环

    #!/bin/bash

    #

    declare –I i=1

    while [ $i  le 10] ;do

    rdm=$RANDOM

    echo –ne “$rdm\t”

        if [ $i –eq 1 ] ;then

            max=$RANDOM

            min=$max

                if [ $rdm –gt $max ] ; then

                        max=$rdm

                elif [ $rdm –lt $min ] ;then

                        min=$rdm

                fi

    done

    echo

    echo “The max number is $max”

    echo “The min number is $min”

 

方法三:使用until循环

    #!/bin/bash

    #

    declare –I i=1

    until [ $i –gt 10 ] ;do

    rdm=$RANDOM

    echo –ne “$rdm\t”

            if [ $i –eq 1 ] ;then

                    max=$RANDOM

                    min=$max

            elif [ $rdm –gt $max ] ; then

                    max=$rdm

            elif [ $rdm –lt $min ] ;then

                    min=$rdm

            fi

    done

    echo

    echo “The max number is $max”

    echo “The min number is $min”

 9.jpg

6、  打印国际象棋棋盘

方法一:使用for循环

国际棋盘的规律就是,颜色是交替出现的,这时可以用奇偶数来进行判断,当行和列取模作差运算等于就说明是偶数,打印一个颜色,如果为奇数打印另一种颜色,颜色的控制利用空格加背景色来控制

    #!/bin/bash

    #

    for in in {1..10}; do

            for a in {1..10};do

                if [ $[a%2 – i%2 ] –eq 0 ] ;then

                         echo  -ne  "\033[40m  \033[0m"

                     else

                         echo echo  -ne  "\033[42m  \033[0m"

                     fi    

                         let a++

             done

         echo

                         let i++

         done

 

         方法二:使用while循环

    #!/bin/bash

    #

    declare –I i=1

    while [ $i –le 10 ]; do

    declare –I a=1

            while [ $a –le 10 ];do

                    if [ $[a%2 – i%2 ] –eq 0 ] ;then

                                 echo  -ne  "\033[40m  \033[0m"

                         else

                                 echo echo  -ne  "\033[42m  \033[0m"

                         fi

                                 let a++

                 done

         echo

         let i++

         done

 11.jpg

 

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

     #!/bin/bash
    #
    a=`who |grep "^hacker\>" |tr -s  ' ' '%' |cut -d % -f3-4|tr '%'  ' '`
    tty=`who |grep "^hacker\>"|awk -F ' ' '{print $2}'`
    host=` who |grep "^hacker\>" |cut -d \( -f2|cut -d \) -f1`
    until  false  ; do
        who |grep "^hacker\>"
                if [ $? -eq 0 ] ; then
                        echo   "$a\n$host" |write hacker  $tty
                fi
    
    sleep 3
    done

    12.jpg

 

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

    #!/bin/bash

    #

    declare -i i=0

    read -p "please input a number:"   Num

        until [ $Num -gt 10 ] ;do

            a=`echo $[RANDOM%11]`

                                 

                  lif [[ $Num -gt $a ]] ;then

                            echo "upper"

                            exit 3

                    elif [[ $Num -lt $a ]];then

                           echo "lower"

                            exit 4

                elif [[ $Numb -eq $a ]];then

                        echo "your are write"

                        exit 5

                fi

        done
13.jpg

    9、打印等腰三角形

   找出 等腰三角形的规律,下面一行跟上面的一行,相差2个字符,于是公式就是行数*2-1,这里还要控制前面的空白字符,不然打印出来的就不是等腰三角形,还需要找出空白字符的规律,空白字符的规律是总的行数减去当前行数得出的就是空白的字符数

1.jpg

    #!/bin/bash
    #
    read -p "please input a number " n
            for i in `seq  $n`; do
                    for a in `seq $[$n-$i]`;do
                           echo   -n " "
            done
            for b in `seq $[ i*2-1 ]`;do
                    echo -n "#"
            done
    echo
    done

    14.jpg

总结:上面的各种例子当中,都是用到循环来使用,有时也需要用if条件判断,以达到最终实现要表现的效果,所以要熟悉掌握使用各种循环之间的嵌套

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

(0)
fszxxxksfszxxxks
上一篇 2016-08-18
下一篇 2016-08-18

相关推荐

  • Linux文本处理工具

    知识框架图 学习笔记 查看文本 查看文本内容 cat -A:显示控制符 -E:显示行结束符$ -n:打印行号,显示空行 -b:打印行号,空行不编号 -s:压缩连续空白行 tac:反向查看文件内容 rev:文本每行倒序显示 分页查看 more less 查看文件头尾内容 head -c:前n个字节 -n:前n行 tail -c -n -f:跟踪显示文件变化,常…

    2018-03-17
  • varnish学习总结

    什么是web cache?   Web缓存是指一个Web资源(如html页面,图片,js,数据等)存在与Web服务器和客户端(浏览器)直接的副本。缓存会根据进来的请求保存输出内容的副本;当下一个请求到来的时候,如果是相同的URL,缓存会根据缓存机制决定是直接使用副本响应访问请求还是向源服务器再次发送请求。       …

    Linux干货 2015-07-15
  • 常用文本处理工具及grep和正则表达式

    一、文件查看命令 (1)普通查看工具:cat,tac,rev  1、cat命令常用选项    -n:显示行号    -E:显示行结束符$    -A:显示所有控制符  2、tac:从最后一行开始倒序显示  3、rev:将每一行的内容反转显示   (2)分页查看…

    Linux干货 2016-08-11
  • http和apache服务器

    超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。 http/1.1 :1997年1月 引入了持久连接(persistent connection) , tcp连接默认不关闭,可以被多个请…

    2017-12-05
  • php5.4zend-opcache安装

    公司在做高并发压测,fastcgi,apc,ocache,opcache, 几经考虑,最终考虑用opcache,因为作为 zend-opcache合并为php5.5的分支版本,xcache的前途堪虑, 在环境的安装上竟然折腾了半个下午没有搞定,这个作下问题记录。 先说安装, http://php.net/manual/zh/opcache.installat…

    2015-04-20
  • H3C 设备监测命令大全 (v3)

    H3C 设备监测命令大全  display aaa unsent-h323-call-record  display acl      display alarm   urgent   display…

    Linux干货 2016-06-01