• bash中的算术运算及条件测试


    bash的算术运算

    +, -, *, /, %取模(取余), **(乘方)

    实现算术运算:

    • (1) let var=算术表达式
    • (2) var=$[算术表达式]
    • (3) var=$((算术表达式))  //推荐使用这种类C风格
    • (4) var=$(expr arg1 arg2 arg3 ...)
    • (5) declare –i var = 数值
    • (6) echo ‘算术表达式’ | bc

    注意:乘法符号有些场景中需要转义,如*

    bash有内建的随机数生成器:$RANDOM(0-32767)

    echo $[$RANDOM%50] :0-49之间随机数

    [989][root@centos6: /root]# num1=10
    [990][root@centos6: /root]# num2=20
    [993][root@centos6: /root]# let sum=${num1}+${num2}
    [993][root@centos6: /root]# echo ${sum}
    30
    [994][root@centos6: /root]# echo $[${num1}+${num2}]
    30
    [995][root@centos6: /root]# echo $((${num1}+${num2}))
    30
    [996][root@centos6: /root]#  nu12=$(expr ${num1} * ${num2})
    [998][root@centos6: /root]# echo ${nu12}
    200

    增强型赋值:

    +=, -=, *=, /=, %=

    let varOPERvalue

    例如:let count+=3 自加3后自赋值

    自增,自减:

    let var+=1 或 let var++

    let var-=1 或 let var--


    bash条件测试

    判断某需求是否满足,需要由测试机制来实现

    专用的测试表达式需要由测试命令辅助完成


    测试命令

    • test EXPRESSION
    • [ EXPRESSION ]
    • [[ EXPRESSION ]]   //支持正则

    注意:EXPRESSION前后必须有空白字符


    测试表达式的类别

    • 数值比较
    • 字符串测试
    • 文件测试

    数值比较测试

    • -gt: 是否大于
    • -ge: 是否大于等于
    • -eq: 是否等于
    • -ne: 是否不等于
    • -lt: 是否小于
    • -le: 是否小于等于
    [999][root@centos6: /root]# test 1 -gt 3
    [1000][root@centos6: /root]# echo $?
    1
    [1001][root@centos6: /root]# test 1 -lt 3
    [1002][root@centos6: /root]# echo $?
    0
    [1003][root@centos6: /root]# [ 1 -gt 3  ]
    [1004][root@centos6: /root]# echo $?
    1
    [1005][root@centos6: /root]# [ 1 -lt 3  ]
    [1006][root@centos6: /root]# echo $?
    0

    字符串测试:

    • ==:是否等于;
    • >: ascii码是否大于ascii码
    • <: 是否小于
    • !=: 是否不等于
    • =~: 左侧字符串是否能够被右侧的PATTERN所匹配

    注意: 此表达式一般用于[[ ]]中;扩展的正则表达式

    • -z "STRING":字符串是否为空,空为真,不空为假
    • -n "STRING":字符串是否不空,不空为真,空为假

    注意:用于字符串比较时的用到的操作数都应该使用引号

    [1007][root@centos6: /root]# name=xiangge
    [1009][root@centos6: /root]# [ -z "${name}"  ]
    [1010][root@centos6: /root]# echo $?
    1
    [1011][root@centos6: /root]# [ -z "${myname}"  ]
    [1012][root@centos6: /root]# echo $?
    0
    [root@centos6: /root]# [  "${myname}" == "${name}"  ]
    [1019][root@centos6: /root]# echo $?

    注意以下例子:左则字串要能包含下右侧字符串,反之就不行。

    [1007][root@centos6: /root]# name=xiangge
    [1022][root@centos6: /root]# [[ ${name} =~ "xiang" ]]
    [1023][root@centos6: /root]# echo $?
    [1026][root@centos6: /root]# [[ "xiang" =~ "${name}" ]]
    [1026][root@centos6: /root]# echo $?
    1

    文件测试

    存在性测试

    • -a FILE:同-e
    • -e FILE: 文件存在性测试,存在为真,否则为假

    存在性及类别测试

    • -b FILE:是否存在且为块设备文件
    • -c FILE:是否存在且为字符设备文件
    • -d FILE:是否存在且为目录文件
    • -f FILE:是否存在且为普通文件
    • -h FILE 或 -L FILE:存在且为符号链接文件
    • -p FILE:是否存在且为命名管道文件
    • -S FILE:是否存在且为套接字文件

    写一个判断文件类型的脚本

    1#!/bin/bash   
    
       2 #
    
       3 # 用户键入路径,用脚本来判断文件类型
    
       4 read -p "Enter a file path: " filename
    
       5 if [ -z "$filename" ];then
    
       6    echo "usage: Enter a file path."
    
       7    exit 1
    
       8 fi
    
       9  if [ ! -e $filename ];then
       10    echo "NO such file."
       11    exit 2
       12fi
    
       13if [ -f $filename ];then
       14    echo "A common file."
       15 elif [ -d $filename ];then
       16    echo "A common directory."                                
       17 elif [ -L $filename ];then
       18    echo "A symbolic file."
       19 else
       20    echo "other type."
       21 fi

    文件权限测试:(当前用户)

    • -r FILE:是否存在且可读
    • -w FILE: 是否存在且可写
    • -x FILE: 是否存在且可执行

    文件特殊权限测试:

    • -u FILE:是否存在且拥有suid权限
    • -g FILE:是否存在且拥有sgid权限
    • -k FILE:是否存在且拥有sticky权限

    文件大小测试:

    • -s FILE: 是否存在且非空

    文件是否打开:

    • -t fd: fd表示文件描述符是否已经打开且与某终端相关
    • -N FILE:文件自动上一次被读取之后是否被修改过
    • -O FILE:当前有效用户是否为文件属主
    • -G FILE:当前有效用户是否为文件属组

    组合测试条件

    第一种方式:

    COMMAND1 && COMMAND2 并且 COMMAND1 || COMMAND2 或者 ! COMMAND 非

    如:[[ -r FILE ]] && [[ -w FILE ]]

    第二种方式: EXPRESSION1 -a EXPRESSION2 并且 EXPRESSION1 -o EXPRESSION2 或者 ! EXPRESSION 必须使用测试命令进行;

    [990][root@centos6: /root]# [ -z "$hostName" ] || [ "$hostName" == "centos6.8E" ]
    [991][root@centos6: /root]# echo $?
    0
  • 相关阅读:
    Ninject Lazy Load问题
    log4net 极简配置
    log4net 使用指南,最常遇到的问题整理。。。
    【应聘】阿里巴巴Java面试题目
    【Unity3D】自动寻路(Nav Mesh Agent组件)
    【unity3D】鼠标控制camera的移动、放大(俯视浏览效果、LOL摄像机移动效果)
    【Unity3D】枪战游戏—弹孔设置
    【Unity3D】枪战游戏—发射子弹、射线检测
    【Unity3D】Unity自带组件—完成第一人称人物控制
    软件工程【第5章】- 需求工程与需求设计
  • 原文地址:https://www.cnblogs.com/xiangryan/p/6943478.html
Copyright © 2020-2023  润新知