Shell脚本编程算术运算和条件测试

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell脚本编程算术运算和条件测试相关的知识,希望对你有一定的参考价值。

算术运算

1、bash中的算术运算:help let
        +, -, *, /, %取模(取余), **(乘方)
        实现算术运算:
                (1) let var=算术表达式
                (2) var=$[算术表达式]
                (3) var=$((算术表达式))
                (4) var=$(expr arg1 arg2 arg3 ...)
                (5) declare –ivar= 数值
                (6) echo ‘算术表达式’ | bc
2、乘法符号有些场景中需要转义,如*
3、bash有内建的随机数生成器:
            $RANDOM(0-32767)
            echo $[$RANDOM%50] :0-49之间随机数

赋值

1、增强型赋值:
        +=, -=, *=, /=, %=
2、let varOPERvalue
            例如:let count+=3
                    自加3后自赋值
3、自增,自减:
            let var+=1
            let var++
            let var-=1
            let var--

逻辑运算

1、true, false
            1, 0
2、与:(&)
            1 与1 = 1
            1 与0 = 0
            0 与1 = 0
            0 与0 = 0
------------------------------------
    与运算可以理解为并且的关系
            1代表真
            0代表假
                一个真和一个假与的结果是假
                有一个假的与出来的结果就是假的

    得出结论:
                谁和1与的保留原值
                和0与的不管是什么结果都是0
------------------------------------
3、或:(|)
    1 或1 = 1
    1 或0 = 1
    0 或1 = 1
    0 或0 = 0
------------------------------------
    或运算:
        真和真或结果为真
        1 || 1 = 1
        真和假或结果也为真
        1 || 0  = 1
        假和真或结果也是真
        0 || 1 = 1
        只有两个为假是结果才为假
        0 || 0 = 0

        结论:
            和真与的结果为真
            和假与的保留原值
------------------------------------

逻辑运算

1、非:!
    ! 1 = 0
    ! 0 = 1
2、短路运算
    短路与 (&&)
        第一个为0,结果必定为0
        第一个为1,第二个必须要参与运算
    短路或 (||)
        第一个为1,结果必定为1
        第一个为0,第二个必须要参与运算
3、异或:^
    异或的两个值,相同为假,不同为真
------------------------------------------
示例:判断一个文件是否存在,如果存在就给文件加上执行权限
    1、文件存在时。后续命令继续执行
    [[email protected] ~]#ls anaconda-ks.cfg &> /dev/null && chmod +x anaconda-ks.cfg 
    [[email protected] ~]#ll
    total 1244
    -rwx--x--x. 1 root root    1559 Jul 18 20:55 anaconda-ks.cfg

    2、文件不存在时。后续命令就不再执行了
    [[email protected] ~]#ls an &> /dev/null && chmod +x an
    [[email protected] ~]#echo $?
    2
示例:判断一个账号是否存在,不存在则创建此账号
    [[email protected] ~]#id coodf &> /dev/null || useradd coodf
    [[email protected] ~]#echo $?
    0
    [[email protected] ~]#getent passwd coodf
    coodf:x:1004:1004::/home/coodf:/bin/bash
    [[email protected] ~]#
示例;用异或来兑换两个数字的位置
[[email protected]~/bin]#a=10;b=7;a=$[a^b];b=$[a^b];a=$[a^b]; echo $a $b 
    7 10
------------------------------------------

条件测试

1、判断某需求是否满足,需要由测试机制来实现
        专用的测试表达式需要由测试命令辅助完成测试过程
2、评估布尔声明,以便用在条件性执行中
        ?若真,则返回0
        ?若假,则返回1
3、测试命令:
        ?test EXPRESSION
        ?[ EXPRESSION ]
        ?[[ EXPRESSION ]]
            [[ EXPRESSION ]]
                == 相同,字符串不要加"",支持通配符
                =~ 匹配,字符串不要加"",支持扩展正则表达式
        注意:EXPRESSION前后必须有空白字符
-------------------------------------------------
避免空值的写法 加X即可
    [[email protected] ~]#[ X"$name" = X"$title" ] && echo true || echo false  
    false

    [[ ]] 变量要加"" 正则表达式不用加""
    [[email protected] ~]#var=abc;[[ "$var" =~ ^a ]] && echo true|| echo false
    true

    判断是否以.conf结尾
    [[email protected] ~]#filename=a.conf
    [[email protected] ~]#[[ "$filename" =~ .conf$ ]] &&echo true || echo false
    true

    [[email protected] ~filename=a.con
    [[email protected] ~[[ "$filename" =~ .conf$ ]] && echo true || echo false
    false

    判断一个是否为文件并且这个文件是否有写权限,如果有写权限就给它去掉
    [[email protected] ~]#file=/etc/issue;[ -f $file -a -w $file ] && chmod -w $file

    判断一个是否为文件或者这个文件是否有写权限,如果有写权限就给它去掉
    [[email protected] ~]#file=/etc/issue;[ -f $file -a -w $file ] && chmod -w $file

    判断一个文件不具有写权限,如果没有就给它加上写权限
    [[email protected] ~]#file=/etc/issue;[ ! -w $file ] && chmod +w $file 

    判断一个文件是否具有执行权限,如果没有就给它加上执行权限
    [[email protected] ~]#file=/etc/shadow ; [ ! -x $file ] && chmod +x $file
    [[email protected] ~]#ll /etc/shadow
    ---x--x--x 1 root root 1220 Sep 22 08:26 /etc/shadow
    [[email protected] ~]#
----------------------------------------------------------

条件性的执行操作符

根据退出状态而定,命令可以有条件地运行
    ?&& 代表条件性的AND THEN
    ?|| 代表条件性的OR ELSE
-------------------------------------
示例:
[[email protected] ~]#grep -q no_such_user /etc/passwd || echo ‘No such user‘
No such user

test命令

1、长格式的例子:
    test "$A"="$B"&&echo"Stringsareequal"
    test“$A”-eq“$B”&&echo"Integersareequal"
2、简写格式的例子:
    ["$A"="$B"]&&echo"Stringsareequal"
    ["$A"-eq"$B"]&&echo"Integersareequal"

bash的数值、字符串测试

1、-v VAR
    变量VAR是否设置
2、数值测试:
    -gt是否大于
    -ge是否大于等于
    -eq是否等于
    -ne是否不等于
    -lt是否小于
    -le是否小于等于
3、字符串测试:
    =是否等于
    >ascii码是否大于ascii码
    <是否小于
    !=是否不等于
    =~左侧字符串是否能够被右侧的PATTERN所匹配
    注意: 此表达式一般用于[[ ]]中;扩展的正则表达式
    -z "STRING“字符串是否为空,空为真,不空为假
    -n "STRING“字符串是否不空,不空为真,空为假
4、注意:用于字符串比较时的用到的操作数都应该使用引号

Bash的文件测试

1、存在性测试
    -a FILE:同-e
    -e FILE: 文件存在性测试,存在为真,否则为假
2、存在性及类别测试
    -b FILE:是否存在且为块设备文件
    -c FILE:是否存在且为字符设备文件
    -d FILE:是否存在且为目录文件
    -f FILE:是否存在且为普通文件
    -h FILE 或-L FILE:存在且为符号链接文件
    -p FILE:是否存在且为命名管道文件
    -S FILE:是否存在且为套接字文件
3、文件权限测试:
    -r FILE:是否存在且可读
    -w FILE: 是否存在且可写
    -x FILE: 是否存在且可执行
4、文件特殊权限测试:
    -u FILE:是否存在且拥有suid权限
    -g FILE:是否存在且拥有sgid权限
    -k FILE:是否存在且拥有sticky权限
5、文件大小测试:
    -s FILE: 是否存在且非空
6、文件是否打开:
    -t fd: fd文件描述符是否在某终端已经打开
    -N FILE:文件自从上一次被读取之后是否被修改过
    -O FILE:当前有效用户是否为文件属主
    -G FILE:当前有效用户是否为文件属组
7、双目测试:
    FILE1 -efFILE2: FILE1是否是FILE2的硬链接
    FILE1 -ntFILE2: FILE1是否新于FILE2(mtime)
    FILE1 -otFILE2: FILE1是否旧于FILE2

Bash的组合测试条件

1、第一种方式:
        COMMAND1 && COMMAND2 并且
        COMMAND1 || COMMAND2 或者
        ! COMMAND 非
        如:[[ -r FILE ]] && [[ -w FILE ]]
2、第二种方式:
        EXPRESSION1 -a EXPRESSION2 并且
        EXPRESSION1 -o EXPRESSION2 或者
        ! EXPRESSION
        必须使用测试命令进行

以上是关于Shell脚本编程算术运算和条件测试的主要内容,如果未能解决你的问题,请参考以下文章

bash的算术运算和条件测试语句

shell算术运算和文件测试及多分支if语句

Linux中编写Shell脚本

Shell脚本编程概述:算数运算和条件测试

第五课-第四讲05_04_bash脚本编程之三 条件判断及算术运算

bash的算术运算和条件测试方法