美文网首页Linux学习之路生物信息学与算法Shell
Linux 之 shell script -- 条件判断式(ca

Linux 之 shell script -- 条件判断式(ca

作者: 熊猫人和熊猫猫 | 来源:发表于2019-08-25 23:03 被阅读0次

    1.利用 case ..... esac 判断

    1.1 认识case ..... esac

    上一篇文章提到的if ... then ... fi对于变量的判断是以 “比对” 的方式来分辨的,如果符合状态,就进行某些行为,并且透过较多层次(就是elif...)的方式来进行多个变量的程序代码撰写。case ..... esac也是条件判断式,它拥有和if ... then ... fi同样的功能,只是代码形式上不太相同。

    case ..... esac的语法结构:

    case .. in .. esac 的语法
    把上一篇Linux 之 shell script -- 条件判断式(if ... then)中的 hello-2.shcase .. in .. esac 的语法改写一下

    vi hello-3.sh 输入如下内容:

    #!/bin/bash
    case ${1} in
      "hello")
            echo "Hello,how are you ?"
            ;;
      "")
            echo "You must input parameters, ex> {${0} someword}"
            ;;
      *) #其实就相当于通配符,0-无穷多个任意字符之意!
            echo "Usage ${0} {hello}"
            ;;
    esac
    

    1.2 ${变量} 获取方式

    使用 「case $变量 in」这个语法中,当中的 「$变量」大致有两种取得的方式

    • 1)直接下达式
      利用「script.sh variable」的方式来直接给予$1这个变量的内容,这也是在/etc/init.d目录下大多数程序的设计方式
    • 2)交互式
      透过 read 这个指令来让用户输入变量的内容,例如前面几篇学习中我们一直用到的read -p

    ~~举一个例子来深入理解 $1的下达方式~~

    让使用者能够输入one,two,three并且将用户的变量显示到屏幕上,如果不是one,two,three时,就告知使用者仅有这三种选择。

    vi show123.sh 写入如下代码

    #!/bin/bash
    echo "This program will print your selection !"
    # read -p "Input your choice:" choice #暂时取消,可以替换
    # case ${choice} in #暂时取消,可以替换
    case ${1} in
        "one")
            echo "Your choice is ONE"
            ;;
        "two")
            echo "Your choice is TWO"
            ;;
        "three")
            echo "Your choice is THREE"
            ;;
        *)
            echo "Usage ${0} {one|two|three}"
    esac
    

    以上这段代码是 直接下达式 获取 $变量,如果改成 交互式
    可以将3,4行的#拿掉,同时给第5行加上#

    2. 利用 function 功能

    2.1 认识 function

    函数可以在shell script 当中作出一个类似自定义执行指令的东西,最大的功能是,可以简化我们很多的程序代码。

    • 函数 的语法是这样的
      function的语法
      其中fname是我们定义的函数名,而function的设定一定要在程序的最前面。

    2.2 function 实践

    2.2.1 function初显威力

    在这里,我们改写👆用到过的show123.sh(自定义一个名为printit的函数)
    vi show123-2.sh 写入如下代码

    • 第2-4行为 printit 函数定义
    • 第5行为程序介绍
    • 第6行到最后就是case ... esac形式的多级判断
    #!/bin/bash
    function printit(){
            echo -n "Your choice is" #加上 -n可以不断行继续在同一行显示
    }
    echo "This program will print your selection !"
    case ${1} in
      "one")
            printit; echo ${1} | tr 'a-z' 'A-Z' #这里用 tr 将参数做大小写转换
            ;;
      "two")
            printit; echo ${1} | tr 'a-z' 'A-Z' #这里";"号的存在,是为了实现命令的连续下达
            ;;
      "three")
            printit; echo ${1} | tr 'a-z' 'A-Z'
            ;;
      *)
            echo "Usage ${0} {one|two|three}"
            ;;
    esac
    

    可以看得出来,这个show123-2.sh可是一个直接下达式获取变量的shell,因此运行时不要忘记在命令行执行shell时,在其后为$1赋值。


    2.2.2 function 威力升级

    如果某些程序代码一再地在script当中重复,这个function不但可以简化程序代码,而且可以做成类似“模块”的东西。show123-2.sh还是没有竭尽全力得发挥函数的功能,下面对show123.sh再做一次 升级

    function的内建变量:
    看function威力升级之前先了解这个:function也是拥有内建变量的,他的内建变量与shell script很类似,函数名称代表$0,而后续接的变量也是以$1,$2来取代的

    vi show123-3.sh 写入如下代码:

    #!/bin/bash
    function printit(){
        echo "Your choice is ${1}" #注意哦,这里的${1}指的是函数printit的内建变量$1
    }
    case ${1} in
      "one")
        printit 1 #请注意,printit指令后面还有接参数
        ;;
      "two")
        printit 2
        ;;
      "three")
        printit 3
        ;;
      *)
        echo "Usage ${0} {one|two|three}"
        ;;
    esac
    

    写好后运行一下,我们会惊奇得发现
    执行sh show123-3.sh one的结果竟然是 Your choice is 1
    如果理解了函数的内建变量,就明白输出结果不是Your choice is one的原因
    因为 printit 的定义程序 echo "Your choice is ${1}" 翻译成人话就是 -- 打印 “Your choice is 'printit 的内建变量 $1‘”
    第七行的1,第十行的2,第十三行的3都作为 printit的内建变量 $1被输出。
    理解起来可能有些绕弯弯。。。

    相关文章

      网友评论

        本文标题:Linux 之 shell script -- 条件判断式(ca

        本文链接:https://www.haomeiwen.com/subject/mxtasctx.html