• Shell 运算符


    算数运算符

    # 基本算数运算符
    +,-,*,/,%
    
    # 整形运算四种方法
    $[]
    $(())
    expr
    let
    
    # 浮点数运算
    bc
    

    测试运算符

    test 表达式
    或者
    [ 表达式 ]
    
    #(一)基本形式:
    test EXPRESSION                 # 等同于 [ EXPRESSION ]
    [ ! EXPRESSION ]                # 对测试的结果取反
    [ EXPRESSION1 -a EXPRESSION2 ]  # 左右两个表达式必须都为真,测试结果才为真
    [ EXPRESSION1 -o EXPRESSION2 ]  # 左右两个表达式但凡有一个为真,测试结果就为真
    
    
    [root@www sample]# [ 1 -eq 1 ];echo $?
    0
    [root@www sample]# [ ! 1 -eq 1 ];echo $?
    1
    [root@www sample]# [ 1 -eq 1 -a 3 -gt 2 ];echo $?
    0
    [root@www sample]# [ 1 -eq 1 -a 3 -gt 5 ];echo $?
    1
    [root@www sample]# [ 1 -eq 1 -o 3 -gt 5 ];echo $?
    0
    [root@www sample]# [ 1 -gt 1 -o 3 -gt 5 ];echo $?
    1
    [root@www sample]# 
    
    
    # (二)关于字符串的测试
    # (1) -n STRING :字符长度为不为0结果才为真,字符串为空(什么都没有)结果为假
    [root@www sample]# [ -n "abc" ];echo $?
    0
    [root@www sample]# [ -n "   " ];echo $?
    0
    [root@www sample]# 
    
    [root@www sample]# [ -n "" ];echo $?
    1
    [root@www sample]# 
    
    # (2) -z STRING:与-n相反
    [root@www sample]# [ -z "abc" ];echo $?
    1
    [root@www sample]# [ -z "      " ];echo $?
    1
    [root@www sample]# [ -z "" ];echo $?
    0
    [root@www sample]# 
    
    #(3)STRING1 = STRING2
    [root@www sample]# [ "zzzwqh" = "zzzwqh" ];echo $?
    0
    [root@www sample]# [ "zzzwqh" = "zzzwqhxx" ];echo $?
    1
    [root@www sample]# [ "zzzwqh" == "zzzwqh" ];echo $?  # 建议使用
    0
    
    # (4)STRING1 != STRING2
    [root@www sample]# [ "zzzwqh" != "zzzwqhxx" ];echo $?
    0
    
    
    # (三) 关于整型的比较
    -eq:==
    -ge:>=
    -gt: >
    -le: <=
    -lt: <
    -ne: !=
    # 示例
    [root@www sample]# [ 11 -eq 11 ]
    [root@www sample]# [ 11 -ge 11 ];echo $?
    0
    [root@www sample]# [ 11 -ge 10 ];echo $?
    0
    [root@www sample]# [ 11 -gt 11 ];echo $?
    1
    [root@www sample]# [ 11 -gt 10 ];echo $?
    0
    [root@www sample]# [ 10 -lt 11 ];echo $?
    0
    [root@www sample]# [ 10 -le 10 ];echo $?
    0
    [root@www sample]# [ 10 -ne 10 ];echo $?
    1
    [root@www sample]# 
    
    
    # (四)关于文件的比较
    -d:文件必须存在,而且得是一个目录
    [root@www sample]# [ -d /aaa/ ];echo $?
    1
    [root@www sample]# [ -d /etc ];echo $?
    0
    [root@www sample]# 
    
    
    -e : 只要文件存在即可,不区分文件类型
    [root@www sample]# [ -e /etc/passwd ];echo $?
    0
    [root@www sample]# [ -e /etc ];echo $?
    0
    [root@www sample]# 
    
    
    -f:文件必须存在,而且得是一个普通的文档文件
    [root@www sample]# [ -f /etc/passwd ];echo $?
    0
    [root@www sample]# [ -f /etc ];echo $?
    1
    [root@www sample]# 
    
    -L FILE:文件必须存在,而且得是一个软连接文件
    [root@www sample]# ln -s /etc/passwd a.txt
    [root@www sample]# ll a.txt 
    lrwxrwxrwx 1 root root 11 Aug 26 15:36 a.txt -> /etc/passwd
    [root@www sample]# [ -L a.txt ];echo $?
    0
    [root@www sample]# 
    
    
    文件要存在必须需要有r、w、x权限
    -r
    -w
    -x
    [zzzwqh@Centos7 sample]$ [ -r a.txt ];echo $?
    1
    [zzzwqh@Centos7 sample]$ [ -w a.txt ];echo $?
    1
    [zzzwqh@Centos7 sample]$ [ -x a.txt ];echo $?
    1
    [zzzwqh@Centos7 sample]$ [ -r a.txt ];echo $?
    0
    [zzzwqh@Centos7 sample]$ 
    
    
    -s:当文件内容不为空时结果为真
    [root@Centos7 sample]# ll a.txt 
    -------r-- 1 root root 0 Aug 26 23:42 a.txt
    [root@Centos7 sample]# [ -s a.txt ];echo $?
    1
    [root@Centos7 sample]# echo "hello" >> a.txt
    [root@Centos7 sample]# [ -s a.txt ];echo $?
    0
    [root@Centos7 sample]# 
    

    关系运算符

    [root@Centos7 ~]# (( 10 == 10 ));echo $?
    0
    [root@Centos7 ~]# (( 10 >= 10 ));echo $?
    0
    [root@Centos7 ~]# (( 10 > 10 ));echo $?
    1
    [root@Centos7 ~]# (( 10 < 11 ));echo $?
    0
    [root@Centos7 ~]# (( 10 <= 10 ));echo $?
    0
    [root@Centos7 ~]# (( 10 != 10 ));echo $?
    1
    [root@Centos7 ~]# 
    
    # 了解:比较小数
    [root@Centos7 ~]# echo "10.3 > 10.1" | bc
    1
    [root@Centos7 ~]# echo "10.3 > 10.5" | bc
    0
    [root@Centos7 ~]# echo "10.3 == 10.5" | bc
    0
    [root@Centos7 ~]# echo "10.3 != 10.5" | bc
    1
    [root@Centos7 ~]# 
    
    # 示范
    [root@Centos7 ~]# cat test.sh 
    #!/bin/bash
    
    read -p "float num1>>>: " num1
    read -p "float num2>>>: " num2
    
    if [ `echo "$num1 > $num2" | bc` -eq 1 ]
    then
        echo "$num1 大于 $num2"
    else
        echo "$num1 不大于 $num2"
    fi
    [root@Centos7 ~]# 
    [root@Centos7 ~]# chmod +x test.sh 
    [root@Centos7 ~]# ./test.sh 
    float num1>>>: 1.3
    float num2>>>: 1.5
    1.3 不大于 1.5
    [root@Centos7 ~]# ./test.sh 
    float num1>>>: 1.7
    float num2>>>: 1.3
    1.7 大于 1.3
    

    赋值运算符

    [root@Centos7 ~]# unset x
    [root@Centos7 ~]# let x+=1
    [root@Centos7 ~]# echo $x
    1
    [root@Centos7 ~]# let x+=1
    [root@Centos7 ~]# echo $x
    2
    [root@Centos7 ~]# 
    [root@Centos7 ~]# ((y+=3))
    [root@Centos7 ~]# echo $y
    3
    [root@Centos7 ~]# ((y*=10))
    [root@Centos7 ~]# echo $y
    30
    [root@Centos7 ~]# 
    

    总结

    #1、测试
    [ 表达式1 -a 表达式2 ]
    (( 表达式1 )) && (( 表达式2 )) 
    
    [ 表达式1 -o 表达式2 ]
    (( 表达式1 )) || (( 表达式2 )) 
    
    #2、加上$符号代表计算
    $[]
    $(())
    
    #3、
    ()
    $()
    
    #4、[[]]与[]基本相同,唯一不同的是[[]]支持正则表达式匹配
    [root@Centos7 ~]# [[ -d /etc ]];echo $?
    0
    [root@Centos7 ~]# [[ 1 -eq 1 ]];echo $?
    0
    [root@Centos7 ~]# [[ 1 -gt 10 ]];echo $?
    1
    [root@Centos7 ~]# 
    
    # 验证当前用户是否是管理员用户
    [root@Centos7 ~]# [ $USER == "root" ];echo $?
    0
    [root@Centos7 ~]# 
    
    # 验证当前用户的用户名是否是e开头n结尾的
    [zzzwqh@Centos7 ~]$ [[ $USER =~ ^e.*n$ ]];echo $?
    0
    [zzzwqh@Centos7 ~]$ [[ $USER =~ "^e.*n$" ]];echo $?  # 强调:正则表达式一定不要加引号
    1
    [zzzwqh@Centos7 ~]$ 
    

    练习题

    [root@Centos7 sample]# ./num.sh 
    传入的参数必须是2个
    [root@Centos7 sample]# ./num.sh aa 222
    第一个参数必须是整型数字
    [root@Centos7 sample]# ./num.sh 111 aaa
    第二个参数必须是整型数字
    [root@Centos7 sample]# ./num.sh 111 222
    验证全部通过
    [root@Centos7 sample]# vim num.sh 
    [root@Centos7 sample]# 
    [root@Centos7 sample]# ./num.sh 111 222
    验证全部通过
    111 小于 222
    [root@Centos7 sample]# ./num.sh 333 111
    验证全部通过
    333 大于 111
    [root@Centos7 sample]# ./num.sh 10 10
    验证全部通过
    10 等于 10
    [root@Centos7 sample]# 
    
    

    示例1

    [root@Centos7 sample]# cat num.sh 
    #!/bin/bash
    
    # 第一步:确定参数的个数必须是2个,不是两个就退出
    #条件 && cmd1 || cmd2
    
    #if 条件;then
    #    cmd1
    #else
    #    cmd2
    #fi
    
    if [ $# -ne 2 ];then
       echo "传入的参数必须是2个"
       exit
    fi
    
    # 第二步:确定参数1必须是整型数字,不是就退出
    if [[ ! $1 =~ ^[0-9]+$ ]];then
        echo "第一个参数必须是整型数字"
        exit
    fi
    
    # 第三步:确定参数2必须是整型数字,不是就退出
    if [[ ! $2 =~ ^[0-9]+$ ]];then
        echo "第二个参数必须是整型数字"
        exit
    fi
    
    echo "验证全部通过"
    # 第四步:比较两个整型数字,输出结果
    [ $1 -gt $2 ] && echo "$1 大于 $2"
    [ $1 -lt $2 ] && echo "$1 小于 $2"
    [ $1 -eq $2 ] && echo "$1 等于 $2"
    [root@Centos7 sample]# 
    

    示范2

    [root@Centos7 sample]# cat login.sh 
    #!/bin/bash
    
    db_name="zzzwqh"
    
    db_pwd="123"
    
    read -p "请输入你的用户名:" inp_name
    
    read -p "请输入你的密码:" inp_pwd
    
    if  [ $inp_name  ==  $db_name  -a $inp_pwd == $db_pwd ];then
       echo "告诉用户登录成功"
    else
       echo "告诉用户登录失败"
    fi
    
    [root@Centos7 sample]# 
    
    记录成长过程
  • 相关阅读:
    C复制字符串
    C语言分解数组
    perlCGI编程之测试环境
    linux下c语言 读取文件
    C++的组合(Composite)模式
    C#GDI+绘制多行文本和格式化文本
    shell中引号的应用
    perlCGI编程之Apache服务器安装配置
    求二叉树的深度
    perlCGI编程之页面参数传递
  • 原文地址:https://www.cnblogs.com/zzzwqh/p/13566330.html
Copyright © 2020-2023  润新知