九、退出、测试、判断及操作符

1 退出状态

  • 定义

    在Linux系统中,每当命令执行完成后,系统都会返回一个退出状态,用一个整数值表示,用于判断命令运行正确与否。

  • 说明

    • 若退出状态值为0,表示命令运行成功,而退出状态值不为0时,则表示命令运行失败。

    • 最后一次执行命令的退出状态值被保存在内置变量”$?“中。

  • 退出状态及其含义

    状态值 含义
    0 表示运行成功,程序执行未遇到任何问题
    1~125 表示运行失败,脚本命令、系统命令错误或参数传递错误
    126 找到了该命令但无法执行
    127 未找到要运行的命令
    >128 命令被系统强行结束

2 测试

Linux的Shell命令中存在一组测试命令,该组命令用于测试某种条件或某几种条件是否真实存在。

2.1 测试结构

  • 定义

    测试命令可用于测试表达式的条件的真假。

    • 如果测试的条件为真,则返回一个0值
    • 如果测试的条件为假,将返回一个非0整数值
  • 语法

    • 方式一

      test expression
      
    • 方式二

      [ expression ]
      

      其中 ”[“ 是启动测试的命令,但要求在expression后要有一个”]“与其配对。

      特别注意 ”[“ 后和 "]" 前的空格是必不可少的。

    • 说明

      条件expression是一个表达式,该表达式可由数字、字符串、文本和文件属性的比较,同时可加入各种算术、字符串、文本等运算符。

2.2 整数比较运算符

  • 定义

    整数比较运算符,用于两个值的比较,测试其比较结果是否符合给定的条件。

  • 语法

    # 方式一
    test "num1" numeric_operator "num2"
    # 方式二
    [ "num1" numeric_operator "num2" ]
    
    • numeric_operator为整数比较运算符,不可用于字符串、文件操作

      整数比较运算符 描述
      num1 -eq num2 如果num1等于num2,测试结果为0
      num1 -ge num2 如果num1大于等于num2,测试结果为0
      num1 -gt num2 如果num1大于num2,测试结果为0
      num1 -le num2 如果num1小于等于num2,测试结果为0
      num1 -lt num2 如果num1小于num2,测试结果为0
      num1 -ne num2 如果num1不等于num2,测试结果为0
  • 示例

    [ 12 -eq 14 ] # 测试12是否等于15
    

2.3 字符串运算符

  • 定义

    字符串运算符,用来测试字符串是否为空、两个字符串是否相等或者是否不相等。

  • 字符串运算符

    字符串运算符 描述
    string 测试字符串string是否不为空
    -n string 测试字符串string是否不为空
    -z string 测试字符串string是否为空
    string1 = string2 测试字符串string1是否与字符串string2相同
    string1 != string2 测试字符串string1是否与字符串string2不相同
    • 对于用string进行测试时要注意,仅有一种格式,不存在用[]括起来的命令格式

      test string
      test -n string
      test -z string
      
    • 字符串比较时建议字符串变量要使用双引号,即使变量为空,童谣也要使用双引号

  • 示例

    [ "hello" = “helll” ] #测试"hello"是否等于”helll“
    

2.4 文件操作符

  • 定义

    完成测试文件的各种操作

  • 语法

    # 方式一
    test file_operator file
    # 方式二
    [ file_operator file ]
    
    • file为文件名、目录名或文件路径等

    • file_operator为文件操作符

      文件运算符 描述
      -d file 测试file是否为目录
      -e file 测试file是否存在
      -f file 测试file是否为普通文件
      -r file 测试file是否是进程可读文件-
      -w file 测试file是否是进程可写文件
      -x file 测试file是否是进程可执行文件
      -s file 测试file的长度是否不为0
      -L file 测试file是否是符号化链接
  • 示例

    [ -d filename ] #测试filename是否为目录
    

2.5 逻辑运算符

  • 定义

    逻辑运算符用于测试多个条件是否为真或为假,或使用逻辑非测试单个表达式。

  • 逻辑操作符

    逻辑操作符 描述
    ! expression 如果expression为假,则测试结果为真
    expression1 -a expression2 如果expression1 和 expression2同时为真,则测试结果为真
    expression1 -o expression2 如果expression1和expression2中有一个为真,则测试条件为真
  • 逻辑真

    expr1-a expr2-a expr3
    

    只有当表达式expr1为真时,才会接着测试expr2的值为真,同样,只有在expr1和expr2为真时,才会接着测试expr3的值是否为真。

  • 逻辑或

    expr1-o expr2-o expr3
    

    只有expr1为真,就不用去测试表达式expr2和expr3,只有expr1为假时才去判断表达式expr2和expr3,同样,只有expr1和expr2同时为假时,才去测试expr3。

  • 示例

    # 逻辑非
    [ ! -e filename ] #判断filename是否存在后否定其结论
    # 逻辑与
    [ -e file_name-a -x file_name-a -r file_name ]
    # 逻辑或
    [ -e file_name-o -x file_name-a -r file_name ]
    

3 判断

  • 定义

    对语句中不同的条件进行测试,进而根据不同的条件执行不同的语句。

3.1 if结构

  • 语法

    if expression;then
    	command;
    elif expression;then
    else 
    	command;
    fi;
    

    测试条件后如果没有";",则then语句要换行,否则会产生错误

3.2 exit命令

  • 定义

    exit命令可用来控制程序和表达式的流程。

  • 语法

    exit status
    
    • status用0~255之间的数字表示,一般返回该状态值的同时伴随着脚本的退出,同退出状态一样,参数被保存在shell变量$?中,可通过echo命令进行查询

3.3 case结构

  • 定义

    用于多分支选择语句,常用来根据表达式的值选择要执行的语句。

  • 语法

    case variable in
    value1)
    	command;;
    value2)
    	command;;
    ...
    valueN)
    	command;;
    	 *)
    	command;;
    esac
    

    case结构的变量值variable与value1、value2等进行逐一比较,直到找到匹配的值,如果与其匹配,将执行其后的命令,遇到双分号则跳到esac后的语句执行,如果没有找到与变量值variable匹配的值,脚本将执行默认值"*)"后的命令,直至”;;“为止

4 运算符

4.1 算术运算符

算术运算符包括:+(加运算)、-(减运算)、*(乘运算)、/(除运算)、%(取余运算)、**(幂运算)

4.2 算术符合运算符

+= 、-=、*=、/=、%=

4.3 位运算符

  • 定义

    位运算用于整数间的运算,位运算符是针对整数在内存中存储的二进制数据流中的位进行的操作。

  • 位运算符

    运算符 举例 解释和value值
    <<(左移) value=4<<2 4左移2位,value值为16
    >>(右移) value=8>>2 8右移2位,value值为2
    &(按位与) value=8&4 8按位与4,value值为0
    |(按位或) value=8|4 8按位或4,value值为12
    ~(按位非) value=~8 按位非8,value值为-9
    ^(按位异或) value=10^3 10按位异或3,value值为9
    • 按位与运算,只有两个进制都为1时,结果才为1;
    • 按位或运算,只要有一个二进制位为1,则结果为1;
    • 按位异或运算,两个二进制位数相同(同时为0或1)时,结果为0,否则为1;
    • 按位取反运算符是将二进制中的0修改为1,1修改为0
  • 支持复合运算符

    <<= 、>>=、&=、|=、^=

    • 按位非运算符是一元运算符,无法和赋值运算符组合成复合运算符

4.4 自增自减运算符

  • 定义

    自增自减操作符主要包括前置自增(++variable)、前置自减(--variable)、后置自增(variable++)和后置自减(variable--)。前置操作首先改变变量的值(++用于给变量加1,--用于给变量减1),然后将改变的变量值交给表达式使用;后置变量则是在表达式使用后再改变变量的值。

  • 说明

    要特别注意:自增自减操作符的操作元只能是变量,不能是常数或表达式,且该变量值必须为整数型

4.5 数字常量

  • 定义

    Linux Shell脚本或命令默认将数字以十进制的方式进行处理,如果要使用其他进制的方式进行处理,则需对这个数字进行特定的标记或加前缀。当使用0作为前缀时,表示八进制;当使用0x进行标记时,表示十六进制,同时还可使用num#这种形式标记进制数。

  • 示例

    echo "40" # 十进制
    echo "040" # 八进制
    echo "0x40" # 十六进制
    echo "16#50" # num#形式表示的16进制
    
posted @ 2021-02-19 20:46  Norni  阅读(186)  评论(0编辑  收藏  举报