zoukankan      html  css  js  c++  java
  • shell条件测试结构

    条件测试结构

    • if/then结构用来判断命令列表的退出状态码是否为0(因为在UNIX惯例, 0表示"成功"), 如果成功的话, 那么就执行接下来的一个或多个命令.

    • 有一个专有命令[ (左中括号, 特殊字符). 这个命令与test命令等价, 并且出于效率上的考虑, 这是一个内建命令. 这个命令把它的参数作为比较表达式或者作为文件测试, 并且根据比较的结果来返回一个退出状态码(0 表示真, 1表示假).

    • 在版本2.02的Bash中, 引入了[[ ... ]]扩展测试命令, 因为这种表现形式可能对某些语言的程序员来说更容易熟悉一些. 注意[[是一个关键字, 并不是一个命令.

      Bash把[[ $a -lt $b ]]看作一个单独的元素, 并且返回一个退出状态码.

      (( ... ))let ...结构也能够返回退出状态码, 当它们所测试的算术表达式的结果为非零的时候, 将会返回退出状态码0. 这些算术扩展结构被用来做算术比较

    test, /usr/bin/test[ ], 和/usr/bin/[都是等价命令

    #!/bin/bash
    
    echo
    
    if test -z "$1"
    then
      echo "No command-line arguments."
    else
      echo "First command-line argument is $1."
    fi
    
    echo
    
    if /usr/bin/test -z "$1"      # 与内建的"test"命令结果相同. 
    then
      echo "No command-line arguments."
    else
      echo "First command-line argument is $1."
    fi
    
    echo
    
    if [ -z "$1" ]                # 与上边的代码块作用相同.
    #   if [ -z "$1"                应该能够运行, 但是...
    #+  Bash报错, 提示缺少关闭条件测试的右中括号. 
    then
      echo "No command-line arguments."
    else
      echo "First command-line argument is $1."
    fi
    
    echo
    
    
    if /usr/bin/[ -z "$1" ]       # 再来一个, 与上边的代码块作用相同.
    # if /usr/bin/[ -z "$1"       # 能够工作, 但是还是给出一个错误消息.
    #                             # 注意:
    #                               在版本3.x的Bash中, 这个bug已经被修正了.
    then
      echo "No command-line arguments."
    else
      echo "First command-line argument is $1."
    fi
    
    echo
    
    exit 0

    [[ ]]结构比[ ]结构更加通用. 这是一个扩展的test命令, 是从ksh88中引进的.

    [[和]]之间所有的字符都不会发生文件名扩展或者单词分割, 但是会发生参数扩展和命令替换.

    file=/etc/passwd
    
    if [[ -e $file ]]
    then
      echo "Password file exists."
    fi
    • 使用[[ ... ]]条件判断结构, 而不是[ ... ], 能够防止脚本中的许多逻辑错误. 比如, &&, ||, <, 和> 操作符能够正常存在于[[ ]]条件判断结构中, 但是如果出现在[ ]结构中的话, 会报错.

    在if后面也不一定非得是test命令或者是用于条件判断的中括号结构( [ ] 或 [[ ]] ).

    dir=/home/bozo
    
    if cd "$dir" 2>/dev/null; then   # "2>/dev/null" 会隐藏错误信息.
      echo "Now in $dir."
    else
      echo "Can't change to $dir."
    fi

     算术测试需要使用(( ))

    #!/bin/bash
    # 算术测试.
    
    # (( ... ))结构可以用来计算并测试算术表达式的结果. 
    # 退出状态将会与[ ... ]结构完全相反!
    
    (( 0 ))
    echo "Exit status of "(( 0 ))" is $?."         # 1
    
    (( 1 ))
    echo "Exit status of "(( 1 ))" is $?."         # 0
    
    (( 5 > 4 ))                                      # 真
    echo "Exit status of "(( 5 > 4 ))" is $?."     # 0
    
    (( 5 > 9 ))                                      # 假
    echo "Exit status of "(( 5 > 9 ))" is $?."     # 1
    
    (( 5 - 5 ))                                      # 0
    echo "Exit status of "(( 5 - 5 ))" is $?."     # 1
    
    (( 5 / 4 ))                                      # 除法也可以.
    echo "Exit status of "(( 5 / 4 ))" is $?."     # 0
    
    (( 1 / 2 ))                                      # 除法的计算结果 < 1.
    echo "Exit status of "(( 1 / 2 ))" is $?."     # 截取之后的结果为 0.
                                                     # 1
    
    (( 1 / 0 )) 2>/dev/null                          # 除数为0, 非法计算. 
    #           ^^^^^^^^^^^
    echo "Exit status of "(( 1 / 0 ))" is $?."     # 1
    
    exit 0
  • 相关阅读:
    安卓目录分析——MainActivity.java和activity_main.xml
    安卓目录理解 —— AndroidMainifest.xml
    安卓教程列表
    安卓目录介绍
    ideal 安卓环境搭建
    ideal 2019激活 方法
    binding.gyp not found 安装java npm 报错
    vue-cli脚手架打包页面空白
    .java文件转为.class文件转jar包
    前端框架Vue自学之Vue基础语法(二)
  • 原文地址:https://www.cnblogs.com/zx3212/p/9077254.html
Copyright © 2011-2022 走看看