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)
上一篇 2016-08-18 20:24
下一篇 2016-08-18 22:17

相关推荐

  • 马哥教育网络班22期+第3周课程练习 忍者乱太郎喻成

    1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。  who|awk '{print $1}'|uniq 2、取出最后登录到当前系统的用户的相关信息。 题目不是很清晰我估计是题目想要的是 last -1   cat /etc/pa…

    Linux干货 2016-09-06
  • PXE自动化安装系统服务

    PXE PXE(preboot execute environment,预启动执行环境)是由Intel公司开发的最新技术,工作于Client/Server的网络模式,支持工作站通过网络从远端服务器下载映像,并由此支持通过网络启动操作系统,在启动过程中,终端要求服务器分配IP地址,再用TFTP(trivial file transfer protocol)或M…

    Linux干货 2016-11-07
  • 第三周作业

    1、列出当前系统上所有已登陆的用户名:          [root@yangjifeng~]# who | cut -d ‘ ‘ -f 1 | sort -u     root 2、取出最后登陆到当前系统的用户信息; &nb…

    Linux干货 2017-08-28
  • 第三周博客作业

    who useradd usermod groupadd

    Linux干货 2017-12-17
  • N26_第四周

    1、复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限。 [root@node1 skel]# cp -r /etc/skel/home/tuser1 [root@node1 skel]# chmod go-wrx/home/tuser1/   2、编辑/etc/grou…

    Linux干货 2017-05-26
  • web 服务进阶 httpd配置成https

    web服务进阶 自建CA/https详解 一、SSL与https 1、引言 我们网上购物、网上订票,以及使用支付宝支付过程中都会在网上直接输入账号和密码。这些信息都是非常重要的,如何才能在输入的过程中,不被别人看见和窃取,就需要对你输入的信息进行加密处理。 早期的两主机通信之间是没有加解密程序,后来就在传输层与应用层之间加了一个SSL库,完成加密解密功能。 …

    Linux干货 2016-12-11