Shell编程 case语句+循环+函数+正则表达式

一、多路分支语句  case语句

1、格式 

    case 表达式 in
        模式1)
                ....语句列表
                ;;
        模式2)
                ....语句列表
                ;;
        模式3)
                ....语句列表
                ;;
        *)  //其他情况
                ....语句列表 
                ;;
    esac
    
2、总结 

1)表达式 可以是 一个数字 、变量、字符串

2)case语句真正的功能强大之处不在于 使用固定的字符串,还可以使用模式进行匹配。
   一个模式 是由 一串正规字符 和 特殊的通配符组成的字符串, 该模式可以用正则表达式。
   
3、例子 
例子1:

    #!/bin/bash


    read -p "input data:" val

    case $val in
        1)
            echo "1"
            ;;
        2)
            echo "2"
            ;;
        3)
            echo "3"
            ;;
        *)
            echo "other"
            ;;
    esac


例子2:
    
 

   #!/bin/bash


    read  -p "input data:" str


    case $str in 
        h*) ---》只要是以h开头的字符串都会被匹配到
            echo "h........."
            ;;
        w*)---》只要是以w开头的字符串都会被匹配到
            echo "w........."
            ;;
        [0-9]*) ---》只要是以0到9数字开头的字符串都会被匹配到
            echo "this is 0-9"
            ;;
    esac

    


    
练习1:假设有一个文件1.txt,内容为10,要求写一个脚本,判断文件的内容 

        如果文件内容是 10 则 打印 big 
        如果文件内容是 5  则  打印  mid
        如果文件内容是其他值,则打印 other       

 #!/bin/bash
        
        #如果传递进来的参数个数 不等于1的时候
        if [ $# -ne 1 ];then
            echo "input arg<1"
            exit
        fi

        if test -s $1;then
            fileData=`cat $1`
            
            case $fileData in
                10)
                    echo "big"
                    ;;
                5)
                    echo "mid"
                    ;;
                *)
                    echo "other"
                    ;;
            esac
        else 
            echo "file not exist"
        fi


        执行的时候,./test.sh 1.txt
        
二、循环语句

1、for


1)第一种格式:
        for 变量名 in  单词表
        do
        
        done

2)例子:

例子1:     

   #!/bin/bash

        for val in 1 2 3 4 5
        do
            echo -n "$val"
        done

        for循环中,每次挨个从单词表当中获取一个数据,赋值给变量val

例子2:       

  #!/bin/bash


        for val in $*
        do
            echo  "$val"
        done

    执行的时候 
    
    gec@ubuntu:~/shelltest$ ./05for.sh 10 20 30 40 50
    10
    20
    30
    40
    50
    
    解析:从命令行中传递了 5个字符串到脚本中,脚本里面使用了位置变量$*可以获取到所有传递进来的字符串。

3)第二种格式(类似C语言的方式)

  

 for((i=0; i<5; i++))
    do
        echo "$i"
    done
    
    //双圆括号(())可以使得shell程序 用C语言的for风格写法


    
4)例子: 

    #!/bin/bash


    for((i=0; i<5; i++))
    do
        echo "$i"
    done

    
    
2、while

1)格式 
        while 命令或者表达式
        do
            语句 
        done 

    ==》也可以使用C语言的while风格
    
        while((1))
        do
            语句
        
        done
    
例子: 从键盘上获取一个最小值 和 最大值, 打印他们两个之间的所有取值 


        min = 5
        max = 10   
        
        C语言的写法:

while(min<max)
        {
            printf("%d ",min);
            min++;
        }


        
        shell---》
        
     shell的写法:

   #!/bin/bash


        read -p "min data:" min
        read -p "max data:" max 

        #while test $min -le $max
        #while [ $min -le $max  ]
        while((min<=max))
        do
            echo -n "$min"
            min=`expr $min + 1`
        done


练习2:写一个shell脚本, 分别使用 for  和 while 算出 1+2+。。。。+100的和        

    C---> 
    

    int i;
        int sum=0;
        for(i=1; i<=100; i++)
        {
            sum+=i;
        }


    
    shell-->
    

    #!/bin/bash

    #for

    sum=0

    for((i=0; i<=100; i++))
    do
        sum=`expr $sum + $i`
    done

    echo "sum:$sum"

    
    C---->while 
   

int i=1,sum=0;
        while(i<=100)
        {
            sum+=i;
            i++;
        }

    shell--->while 
    
      

  i=1
        sum=0

        while((i<=100))
        do
            sum=`expr $sum + $i`
            i=`expr $i + 1`
        done

        echo "sum:$sum"

注意: break 和continue 跟C语言 的用法  差不多

    
练习3: 写一个脚本,可以实现不断地从键盘中获取数据
            如果获取的数据为"exit",则退出
            如果获取的数据小于100,则打印这个值
            如果获取的数据是其他的,则打印 other 

第一种写法:            
        #!/bin/bash

        while((1))
        do
            read -p "input data:" str

            if test $str = "exit" ;then
                break
            elif test $str -lt 100;then
                echo "$str"
            else
                echo "other"
            fi
        done


第二种写法:        
        while((1))
        do
            read -p "input data:" str
            
            case $str in
                exit)
                    exit
                    ;;
                [0-9][0-9])
                    echo "$str"
                    ;;
                [0-9])
                    echo "$str"
                    ;;
                *)
                    echo "other"
                    ;;
            esac        
        done
    
   


三、函数 

1、格式 
    函数名字()
    {
        命令列表
        
        return 返回值
    }

比如: 
        func()
        {
            echo "func"
            return 12
        }
    
2、注意 

1)函数在定义的时候 ()不写参数
2)返回值的大小不超过 1个字节
3)shell中没有变量作用域,如果出现重复变量名会认为是同一个。

3、调用 
    函数名 参数1 参数2 参数3 
    
    比如: 
            func  -->这个就是调用,没有进行传参
            func 10 20 30
            
            在函数内部 10----》$1  20-->$2  30-->$3
            
4、获取函数的返回值 
            func 10 20 30
            ret=$?  -->这个就是获取函数的返回值,存储到变量ret中
            echo "ret:$ret"
    
5、例子

    #!/bin/bash


    func()
    {
        echo "func"
        echo "$1"
        echo "$2"
        echo "$3"
        return 11
    }


    func 10 20 30

    ret=$?

    echo "ret:$ret"

练习4:编写一个脚本,封装一个函数从键盘上输入两个数,实现比较两个数的最大值,并且打印出来
            
            #!/bin/bash 
                    
            compare()
            {
                if test $1 -ge $2;then 
                    max=$1
                else 
                    max=$2
                fi
            }
                                
            read -p "input data:" val1 val2
            compare $val1 $val2  
            echo "max:$max"
            
            
练习5:编写一个脚本,实现一个函数从键盘上输入两个数a和b,求 a+....+b的和
            a=10  b=20  --> 10+11+12...+20的和
    
    
        #!/bin/bash 
        
        sum=0
        
        get_sum()
        {
            for((i=$1; i<=$2; i++))
            do
                sum=`expr $sum + $i`
            done
        }
        
        read -p "input data:" val1 val2
        get_sum  $val1 $val2 
        echo "sum:$sum"
    


四、正则表达式

字符串是计算机应用中最广泛的处理对象之一(网页、文档),并且字符串组合规则形式多样,比如
数字字符串       123456
C语言标识符        “hello”
IP地址字符串      192.168.11.44
。。。。
上面这些都是我们程序设计需要处理的对象,现在的问题是:计算机要处理这些字符串,首先需要某种语言去描述符这些字符串的规则
===>正则表达式,它就是描述某一个特定规则的表达式

[ 0-9]+  --->数字

正则表达式 的字符组成

正则表达式是由一些字符去描述规则,在正则表达式中有两类字符


1、元字符:不代表自己,代表某个特定的字符 或者多个字符  

2、普通字符:仅代表自身的字符     \元字符 -->普通字符


正则表达式 有不同的流派(java  c#   py  ),不同的语言都用到了正则表达式,但是这些语言用来描述字符串规则 不是都一样,我们称为 正则表达式有不同的流派。


元字符: 不代表自己,代表某个特定的字符 或者多个字符 

.      匹配任意单个字符,英文字母、数字。。。。。本身
[] 字符组。 从 [] 内任选 一个字符 ,比如 [0-9]代表任意一个数字字符  [a-h] 
[^] 字符组。 从[] 外任选一个字符 ,比如 [^0-9] 代表任意一个非数字字符
\d   代表一个数字字符  \d ==> [0-9]
\D   代表一个非数字字符  \D ==> [^0-9] 
\w    匹配字母、数字、下划线   ==> [a-zA-Z0-9_]
\W    匹配非字母、数字、下划线 ==> [^a-zA-Z0-9_]
\s    匹配空白字符  [\n\t\r]
\S       匹配非空白字符  [\n\t\r]    
\b    匹配单词边界        
         "hello world 123"--->现在用一个表达式匹配world   \bworld\b
      
 *   匹配0个或者多个 先前字符(先前模式),  比如:.*   匹配任意字符串
             比如  aa  aaa  bbb   cccc  aaaaa ---a*  
 ?  匹配0个或者1个先前字符 (先前模式)   比如   a aa aaa  aaaa      
 +   匹配 一个或者多个先前字符 (先前模式)   "a+ "

 {数字}    匹配固定数目的先前字符    比如  a{3}
 
 [0-9]{1,2} ---->  sdsdssdasd1244adsds234adfsd454ads4564sfdfsdfr56sadf
{最小数目,最大数目}     a{1,3}
{最小数目,}   从最小值开始匹配    "a{3,}"
()      作为一个整体,子模式   如  (abc){2,3}
    
   "[a]"
aaaa bbbcccc aaa adbasd

aa  bbbaa

所谓的匹配指的是 通过 正则表达式 找到 符合条件的字符串 
正则表达式 ----》处理字符串    "a*"

正则表达式 在线测试工具 :https://c.runoob.com/front-end/854/


练习8: 用正则表达式 配出 5块钱以下的钥匙  2yaoshi  4yaoshi 

    adsdad3yaossdsdsdfdadsd6yaoshi asdsdsds2yaoshiasdsd

答案:[0-4]yaoshi



    
    

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值