• 『忘了再学』Shell流程控制 — 34、if条件判断语句(二)


    1、多分支if条件语句格式

    shell
    if [ 条件判断式1 ]
        then
            当条件判断式1成立时,执行程序1
    elif [ 条件判断式2 ]
        then
            当条件判断式2成立时,执行程序2
    
    …省略更多条件…
    
    else
        当所有条件都不成立时,最后执行此程序
    fi

    2、练习

    我们写一个例子,用if多分支条件语句来判断一下用户输入的是一个文件,还是一个目录。

    shell
    # 需求:判断用户输入的是什么文件
    [root@localhost tmp]# vim if-elif.sh
    
    # 编写Shell脚本
    #!/bin/bash
    
    # 1.接收键盘的输入,并赋予变量file
    read -t 30 -p "Please input a filename: " file
    
    # 2.判断文件类型
    # 2.1判断file变量是否为空
    if[ -z "$file" ]
        then
            # 如果为空,执行程序1,也就是输出报错信息
            echo "Error,please input a filename!"
    
            # 退出程序,并返回值为1(把返回值赋予变量?)
            exit 10001
    
    # 2.2判断file的值是否存在
    elif [ ! -e "$file" ]
        then
            # 如果不存在,则执行程序2
            echo "Your input is not a file!"
    
            # 退出程序,把并定义返回值为2
            exit 10002
    
    # 2.3判断file的值是否为普通文件
    elif [ -f "$file" ]
        then
            # 如果是普通文件,则执行程序3
            echo"$file is a regulare file!"
    
    # 2.4判断file的值是否为目录文件
    elif [ -d "$file" ]
        then
            # 如果是目录文件,则执行程序4
            echo"$file is a directory!"
    
    # 2.5如果以上判断都不是,则执行程序5
    else
        echo "$file is an other file!"
    
    fi

    3、说明

    Shell程序是顺序执行的,以上面例子为例,如果当第一个条件判断你是否输入内容就识别内容为空了,就会输出错误信息。因为Shell程序是顺序执行,所以后边的程序还会继续执行。那第一个条件已经判断出错误了,那后边的匹配条件肯定也符合不了,再继续执行程序就是浪费资源了。

    所以处理这类情况使用exit命令进行返回,用exit + 数字编码(自定义)的形式进行返回(推出脚本执行)。

    什么意思?

    我们之前说过一条命令正确执行,$?变量中保存的值是0

    如果命令没有正确执行,$?变量中保存的值是非0

    在Shell中使用exit + 数字编码的形式进行返回,这个数字编码就会赋值给$?变量。

    最后执行完脚本来排错的时候,可以查看$?变量,根据$?变量的值,我们就可以很方便的找到Shell脚本中具体的内容,来排查程序出现的问题。

    总结:

    不符合规范的输入,也就是可能使程序报错的输入,可以用exit + 数字编码的形式进行返回,如上面练习中的2.1和2.2。

    而符合规范的输入,直接匹配选项进行处理即可,不用写返回,如2.3和2.4。

    4、综合练习

    计算器脚本改进:

    shell
    #!/bin/bash
    # 字符界面加减乘除计算器。
    
    # 1.通过read命令接收要计算的数值,并赋予变量num1和num2
    read -t 30 -p "Please input num1: " num1
    read -t 30 -p "Please input num2: " num2
    
    # 2.通过read命令接收要计算的符号,并赋予变量ope.
    read -t 30 -p "Please input a operator: " ope
    
    # 第一层判断
    # 用来判断num1、num2和ope中都有值。
    # -n选项:判断后边的字符串是否为空,非空为真。
    # -a选项:逻辑与。
    if [ -n "$num1" -a -n "$num2" -a -n "$ope" ]
        then
            # 判断输入的num1和num2内容是否是纯数字 
            # 判断一个变量的内容是否是纯数字有很多方法,下面一种是简单好理解的。
            # 定义变量test1和test2的值为$(命令)的结果。
            test1=$(echo $num1 | sed 's/[0-9]//g')
            test2=$(echo $num2 | sed 's/[0-9]//g')
    
            # 说明:
            # 就是通过sed命令,把变量test1值中的每一个字符,只要是0-9的内容,就替换为空。
            # 最后如果test1的值最后为空,证明test1变量中的内容全部为数字,因为全部被替换了。
            # 如果test1的值最后不为空,证明test1变量中的内容有非数字,即test1非纯数字。
    
            # 第二层判断,用来判断num1和num2为数值。
            # 如果变量test1和test2的值为空,则证明numl和num2是数字.
            # -z选项:判断字符串是否为空(为空返回真)
            # -a选项:逻辑与。
            if [ -z "$test1" -a -z "$test2" ]
                then
                    # 如果test1和test2是数字,则执行以下命令。
    
                    # 第三层判断用来确认运算符。
                    # 确认变量$ope中是什么运算符。
                    # 如果是加号则执行加法运算。
                    if [ "$ope" == '+' ]
                        then
                            value=$(($num1+$num2))
                    # 如果是减号,则执行减法运算。
                    elif [ "$ope" == '-' ]
                        then
                            value=$(($num1-$num2))
                    # 如果是乘号,则执行乘法运算。
                    elif [ "$ope" == '*' ]
                        then
                            value=$(($num1*$num2))
                    # 如果是除号,则执行除法运算。
                    elif [ "$ope" == '/' ]
                        then
                            value=$(($num1/$num2))
    
                    else
                        # 如果运算符不匹配,提示输入有效的符号
                        echo "Please enter a valid symbol."
                        # 并退出程序,返回错误代码10。
                        exit 10
    
                    fi
    
            else
                # 如果test1和test2不为空,说明numl和num2不是数字。
                # 则提示输入有效的数值。
                echo "Please enter a valid value."
                # 并退出程序,返回错误代码11。
                exit 11
            fi
    else
        echo "qing input neirong."
        exit 12
    fi
    
    # 输出数值运算的结果。
    echo "$num1 $ope $num2:$value"
    

    注意:

    建议if条件语句嵌套最多不能超过三层。

    如果写在一起if条件语句嵌套过多,则可以拆开写。


    __EOF__

  • 本文作者: 繁华似锦的博客
  • 本文链接: https://www.cnblogs.com/liuyuelinfighting/p/16392572.html
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    数据结构--线性表
    智能合约是什么?
    华为云云服务器评测 | 微信小程序使用JSAPI实现微信支付,从商户注册到成功支付全流程说明(含完整测试demo)
    Codeforces Round 884 (Div. 1 + Div. 2)C. Particles(找性质、奇偶性)
    仙人掌之歌——投石问路(1)
    mindspore数据加载与处理
    Jenkins(笔记)
    读书笔记:《北大管理课》
    LiveData常见问题
    汉堡炸鸡快餐店商城小程序的作用是什么
  • 原文地址:https://www.cnblogs.com/liuyuelinfighting/p/16392572.html