当前位置: 首页 > news >正文

【Linux】shell中运算符(整数、字符串)

文章目录

  • 1. 整数
    • 1.1、算数运算符
      • 1.1.1 加减乘除运算
      • 1.1.2 =号关系运算
        • 1.1.2.1 =(赋值)、==(等于)、!=(不等于)的使用
        • 1.1.2.2 >、>=、<、<=的使用
    • 1.2 $((运算式)) 双括号形式 、 $[运算式] 语法 进行运算
    • 1.3 -eq关系运算符
    • 1.4 =、==、-eq的区别
  • 2 字符串
    • 2.1 字符串运算
  • 3 逻辑运算符
  • 参考

在shell中,和其他编程语言一样也有多种运算符,常用的运算符有:算数运算符、关系运算符、逻辑运算符、字符串运算符、文件测试运算符等。

但是由于存在整数和字符串,处理的语法稍有不同;因此我们划分整数和字符串类型

1. 整数

1.1、算数运算符

算数运算符就是我们最常见的,常用的主要有+(加)、-(减)、*(乘)、/(除)、%(取余)、=(赋值)、==(等于)、!=(不等于)。

下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20:

运算符说明举例
+加法`expr $a + $b` 结果为 30。
-减法`expr $a - $b` 结果为 -10。
*乘法`expr $a \* $b` 结果为  200。
/除法`expr $b / $a` 结果为 2。
%取余`expr $b % $a` 结果为 0。
=赋值a=$b 将把变量 b 的值赋给 a。
==相等。用于比较两个数字,相同则返回 true。[ $a == $b ] 返回 false。
!=不相等。用于比较两个数字,不相同则返回 true。[ $a != $b ] 返回 true。

注意:条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]。

1.1.1 加减乘除运算

shell是不支持简单的数学运算的,这时候我们就可以使用expr命令来实现shell中的简单运算,expr 是一款表达式计算工具,使用它能完成表达式的求值操作。expr的命令使用方法是:比如1+2要写成expr 1 + 2,expr和计算公式需要写在 ` ` 中(方括号,esc下面的那个按钮)并且数值和运算符之间要有空格 `expr 1+2`是不对的。

不带运算符,会当做普通字符串进行输出:

echo "1+2"   #先试下正常的运算方式能否得到结果
#打印结果  1+2

带了运算符,如果没有空格,会当做普通字符串进行输出

echo `expr 1+2`   #数值和运算符中间没有空格时
#打印结果  1+2

正例,注意乘法运算需要转义字符

echo `expr 1 + 2`   #加法
#打印结果  3
echo `expr 2 - 1`   #减法
#打印结果  1
echo `expr 2 \* 3`   #乘法必须要使用反斜杠才能实现
#打印结果  6
echo `expr 2 * 3`   #乘法没有反斜杠时
#打印结果  expr: 语法错误echo `expr 6 / 2`   #除法
#打印结果  3
echo `expr 6 % 4`   #取余
#打印结果  2

1.1.2 =号关系运算

什么是关系运算?就是比大小、判断是否相等,常用在 if 条件判断中

出去加减乘除,剩下的符号中,有的可以进行简单的关系运算, =(单等于)、==(等于)、!=(不等于) 、>、>=、<、<=

注意:if 条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]。

不建议使用 == 、> 、 >= 等符号进行数字比较,因为如果是字符串的话,也可以使用 ,并且表示不同的含义,这样如果数字类型变量误定义为字符串类型,不容易发现错误,建议使用 -eq 语法进行比较。

1.1.2.1 =(赋值)、==(等于)、!=(不等于)的使用

在 if 语法中,放在[] 中 ,示例:

#!/bin/bash
a=10
b=20if [ $a == $b ]
thenecho "a 等于 b"       # 不打印
fi
if [ $a != $b ]
thenecho "a 不等于 b"     #打印
fi

1.1.2.2 >、>=、<、<=的使用

< 小于(需要双括号),如:  if (("$a" < "$b"))<= 小于等于(需要双括号),如: if (("$a" <= "$b"))> 大于(需要双括号),如: if (("$a" > "$b"))>= 大于等于(需要双括号),如: if (("$a" >= "$b"))

在 if 语法中,放在 (( )) 中 ,要和 中括号区分开来,示例:

a=10
b=20if(("$a" < "$b"))
thenecho "a 小于 b"       # 不打印
fi

双括号结构中,变量名引用可以加 $,也可以不加;
运算符前后可以有空格,也可以没有
但是为了方便识别,建议加 $ 并且保留空格

1.2 $((运算式)) 双括号形式 、 $[运算式] 语法 进行运算

我们也可以直接使用 + - 进行简单的运算,但是需要借助 $((运算式)) 双括号形式 和“$[运算式] 语法 ,详情参见 【Linux】 shell 常用的数据类型(数字、字符串和数组)和运算中的 <1.1 计算>章节

1.3 -eq关系运算符

这里提到的关系运算符是特殊的,通过字母实现的,而不是前文的数学符号

下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20,注意使用中括号或双中括号语法:

运算符说明举例
-eq检测两个数是否相等,相等返回 true。[ $a -eq $b ] 返回 false。
-ne检测两个数是否不相等,不相等返回 true。[ $a -ne $b ] 返回 true。
-gt检测左边的数是否大于右边的,如果是,则返回 true。[ $a -gt $b ] 返回 false。
-lt检测左边的数是否小于右边的,如果是,则返回 true。[ $a -lt $b ] 返回 true。
-ge检测左边的数是否大于等于右边的,如果是,则返回 true。[ $a -ge $b ] 返回 false。
-le检测左边的数是否小于等于右边的,如果是,则返回 true。[ $a -le $b ] 返回 true。

示例:

#!/bin/basha=10
b=20if [ $a -eq $b ]
thenecho "$a -eq $b : a 等于 b"
elseecho "$a -eq $b: a 不等于 b"    # 打印
fiif [ $a -ne $b ]
thenecho "$a -ne $b: a 不等于 b"   # 打印
elseecho "$a -ne $b : a 等于 b"
fiif [ $a -gt $b ]
thenecho "$a -gt $b: a 大于 b"
elseecho "$a -gt $b: a 不大于 b"    # 打印
fiif [ $a -lt $b ]
thenecho "$a -lt $b: a 小于 b"      # 打印
elseecho "$a -lt $b: a 不小于 b"
fiif [ $a -ge $b ]
thenecho "$a -ge $b: a 大于或等于 b"
elseecho "$a -ge $b: a 小于 b"    # 打印
fiif [ $a -le $b ]
thenecho "$a -le $b: a 小于或等于 b"   # 打印
elseecho "$a -le $b: a 大于 b"
fi

关系运算符的应用范围只支持数字(确切的说是整数,小数暂不确定),不支持字符串,因此 建议数字 进行关系运算时采用这种方案,这样如果数字类型变量误定义为字符串类型,可以及时发现错误,例如:

#!/bin/bash
a=10
b=abcif [ $a -eq $b ]
thenecho "a 不等于 b"     
fi

由于b变量是字符串,执行时报类型不是整型错误:

[ubuntu]$ ./a.sh
./a.sh: line 14: [: abc: integer expression expected

1.4 =、==、-eq的区别

(1)单等号和双等号能用于字符string类型和整型integer的相等判断。
(2)相等关系运算符“-eq”仅能用于整型integer的相等比较。
(3)相等关系运算符“-eq”不能在算数运算表达式“(( ))”中
(4)在 if 条件表达式 “[ ]”中,单等号和双等号等价,都是相等算数运算符。
(5)在算数运算表达式“(( ))”中,单等号是赋值算数运算符,双等号为相等算数运算符。

总结:在进行相等判断时,最通用的方法是使用双等号“==”相等判断符,避免使用单引号引起歧义。而且数字比较和字符串比较都可以用 == 号,并且建议数字类型时使用 -eq 语法,这样可以检测非数字异常。

2 字符串

2.1 字符串运算

参见

3 逻辑运算符

参见 【Linux】shell中的逻辑运算符

参考

Shell 基本运算符
linux shell中的比较符号与特殊符号介绍

http://www.lryc.cn/news/11949.html

相关文章:

  • 【从零单排Golang】第八话:通过cache缓存模块示范interface该怎么用
  • 解析从Linux零拷贝深入了解Linux-I/O(上)
  • JavaScript系列之公有、私有和静态属性和方法
  • 过滤器与拦截器
  • spring boot 和cloud 版本升级
  • untiy 录制网络摄像头视频并保存到本地文件
  • 微服务架构设计模式-(15)部署
  • Redis:数据结构
  • 2.18 设置language和中文输入法
  • 图解LeetCode——剑指 Offer 28. 对称的二叉树
  • Qt Desginer布局方法
  • C/C++、Java、Python的比较及学习(3)
  • 智慧校园建设方案
  • ARM uboot 源码分析5 -启动第二阶段
  • 【ip neigh】管理IP邻居( 添加ARP\NDP静态记录、删除记录、查看记录)
  • Java程序员线上排查问题神器-Arthas
  • 上市公司企业持续创新能力、创新可持续性(原始数据+计算代码+计算结果)(2008-2021年)
  • 华为OD机试 - 考古学家(JS)
  • Leetcode.2100 适合打劫银行的日子
  • linux ubuntu查日志信息以及错误排查
  • DOS经典软件,落下帷幕,新型国产平台,蓬勃发展
  • MongoDB数据存储格式
  • ARC126D Pure Straight
  • 基于RK3588的嵌入式linux系统开发(四)——uboot镜像下载(基于RKDevTool工具)
  • 设计模式之策略模式与责任链模式详解和应用
  • 广度优先搜索(BFS)-蓝桥杯
  • Java Type类
  • Springboot扩展点之CommandLineRunner和ApplicationRunner
  • ngixn 常用配置之文件类型与自定义 log
  • 【100个 Unity实用技能】 | Unity 通过自定义菜单将资源导出