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

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

作者: 熊猫人和熊猫猫 | 来源:发表于2019-08-24 20:56 被阅读0次

    条件判断式

    很多时候,我们都必须需要某些数据来判断程序该如何进行,简单的方式可以利用 &&||,但如果我们还想要执行一堆指令呢?就可以用if then 来帮忙啦(当符合某个条件判断的时候,就予以进行某项工作),这个if ... then的判断还有多层次的情况,这里我们分别介绍来学习。条件判断式除了if ... then之外,还有case ... esac 这种形式,不过因为内容量太大,case ... esac我们放在下一篇文章里学习。

    1.利用 if ... then

    1.1 单层、简单条件判断式

    • 语法结构:
      单层、简单条件判断式
      把上一篇Linux 之 shell script -- 善用判断式
      提到的ans_yn.sh代码改一改,就是一个简单的条件判断式
    • 原本模样:
      [ "${input}" == "Y" -o "${input}" == "y" ]
    • 可以替换为
      [ "${input}" == "Y" ] || [ "${input}" == "y" ]
    • 把 ans_yn.sh 升级为 ans_yn_2.sh
      vi ans_yn_2.sh 输入如下代码,运行可以获得ans_yn.sh同样的效果。
    #!/bin/bash
    read -p "Please input 'Y' or  'N' to execute this program:" input
    if [ "${input}" == "Y" ] || [ "${input}" == "y" ]; then
        echo "OK,continue"
        exit 0
    fi
    if [ "${input}" == "N" ] || [ "${input}" == "n" ]; then
         echo "Oh,interrupt!"
         exit 0
    fi
    echo "I don't know what your choice is" && exit 0
    

    1.2 多重、复杂条件判断式

    在同一个数据的判断中,如果该数据需要进行多种不同的判断时,就需要更加复杂的判断式了

    • 一个条件判断,分成功进行与失败进行(else)


      if [条件判断式]; then else fi
    • 多个条件判断(if ... elif ... elif ... else)分多种不同情况执行


      if ... elif ... elif ... else

    注意:elif后面都要接then来处理(因为elif也是个判断式);else已经是最后的没有成立的结果了,所以else后面并没有then
    我们把ans_yn.sh进一步改进,升级为 ans_yn_3.sh

    vi ans_yn_3.sh
    输入如下代码再次运行,可以获得与ans_yn.sh同样的结果。

    #!/bin/bash
    read -p "Please input 'Y' or  'N' to execute this program:" input
    if [ "${input}" == "Y" ] || [ "${input}" == "y" ]; then
        echo "OK,continue"
    elif [ "${input}" == "N" ] || [ "${input}" == "n" ]; then
        echo "Oh,interrupt!"
    else
        echo "I don't know what your choice is"
    fi
    

    仔细观察会发现,ans_yn_3.sh相对于ans_yn_2.shans_yn.sh,已经不需要exit 0来控制程序的执行了,正是由于if ... elif ... elif ... else提供了 多条件判断 的功能,将条件“Y/y”,"N/n"非“Y/y/N/n”根据优先级分了3个层次,让${input}依次比对,符合哪一个条件,就只执行 该条件 对应的那个程序段。

    可能上面一个例子不够爽,我们再来一个练习,加深理解~

    撰写shell的要求:
    (1)判断shell script的参数$1是否为 hello,如果是的话,就显示“Hello,how are you”;
    (2)如果没有加任何参数,就提示使用者必须要使用的参数下达法;
    (3)而如果加入的参数不是hello,就提醒使用者仅能使用hello为参数。

    这里涉及shell script的默认参数,不理解的话可以查看Linux 之 shell script -- 善用判断式中的 3.shell script 的默认变数

    我们为这个shell命名 hello-2.sh ,输入如下代码,然后在命令行中按照👇3种方式执行,看有怎样的结果?
    (1) sh hello-2.sh hello
    (2) sh hello-2.sh hehe
    (3) sh hello-2.sh

    #!/bin/bash
    if [ "$1" == "hello" ]; then
        echo "Hello,how are you?"
    elif [ "$1" == "" ]; then
        echo "Please input the parameter, ex> {${0} someword}" #这里的${0}是变量,指shell的文本名
    else
        echo "Please input "hello" as the parameter, ex> {${0} someword}"
    fi
    

    2.Postscript

    嗯,接下来又是一个撰写shell的练习(if ... then练习系列),我觉得很有用,尽管不是很明白网络服务端口是什么意思,还是把这里的代码抄下来了。

    2.1 网络服务端口相关

    • netstat这个指令
      这个指令可以查询到目前主机有开启的网络服务端口(service ports),我们可以利用netstat -tuln来取得目前主机有启动的服务,借鸟哥的图展示一下:

      netstat -tuln(目前主机有启动的服务)
    • 几个常见的port与相关网络服务的关系
      -- 80: WWW
      -- 22: ssh
      -- 21: ftp
      -- 25:mail
      -- 111:RPC(远程过程调用)
      -- 631:CUPS(打印服务功能)

    2.2 查看网络服务端口是否存在

    #!/bin/bash
    #1.先作一些告知的动作而已
    echo "Now, I will detect your Linux server's services!"
    echo -e "The www,ftp,ssh,and mail(smtp) will be detect! \n"
    
    #2.开始进行一些测试的工作,并且也输出一些信息
    testfile=/mnt/user/renyp/learning/netstat_checking.txt
    netstat -tuln > ${testfile} #先转存数据到内存当中!不用一直执行 netstat
    testing=$(grep ":80" ${testfile}) #侦测看 port 80 是否存在
    if [ "${testing}" != "" ]; then
            echo "WWW is running in your system."
    fi
    testing=$(grep ":22" ${testfile}) #侦测看 port 22 是否存在
    if [ "${testing}" != "" ]; then
            echo "SSH is running in your system."
    fi
    testing=$(grep ":21" ${testfile}) #侦测看 port 21 是否存在
    if [ "${testing}" != "" ]; then
            echo "FTP is running in your system."
    fi
    testing=$(grep ":25" ${testfile}) #侦测看 port 25 是否存在
    if [ "${testing}" != "" ]; then
            echo "Mail is running in your system."
    fi
     
    

    提示:由于 每个port是否存在的查询 都是平行关系,没有比较条件的优先级,所以都是if ... then完成,而不需要采用if ... elif ... elif ... else这种多条件判断的方式。
    还有,变量的逻辑运算用$();数值运算用$((计算式))

    相关文章

      网友评论

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

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