shell允许计算算数表达式,但是不能直接使用,需要使用算数展开 $(( exoression )),或者使用((符合命令、let或declare的-i选项。))计算是在固定宽度的整数中进行的,不检查溢出,尽管被0除会被捕捉并标记为错误
shell中常见的算数运算符如下:
算数/逻辑/比较运算符 | 说明/含义 |
---|---|
+、- | 加法(或正号)、减法(或负号) |
*、/、% | 惩罚、除法、取余(取模) |
** | 幂运算 |
++、-- | 自增和自减 |
!、&&、|| | 逻辑非(取反)、逻辑与(and)、逻辑或(or) |
<、<=、>、>= | 比较符号(小于、小于等于、大于、大于等于) |
==、!=、= | 比较符号(相等、不相等;对于字符串,=可以表示相等于) |
<<、>> | 向左移位、向右移位 |
~、|、&、^ | 按位取反、按位或、按位与、按位异或 |
=、+=、-=、*=、/=、%= | 赋值运算符,例如 a+=1相当于a=a+1,a-=1相当于a=a-1 |
Shell变量允许作为操作数;在计算表达式之前执行参数展开。在表达式中,shell变量也可以通过名称引用,二不适用参数展开语法(可以不带$符号,但是不推荐)。当不使用参数展开语法而按名称引用为空或未设置的shell变量时,其计算结果为0.当一个变量被引用时,它的值将被作为一个算数表达式计算,或者当一个变量使用“declare -i”被赋值给一个整数属性时,它的值将被赋值。空值的计算结果为0.
Bash shell在默认情况下不会区分变量类型,即使你将整数和小数赋值给变量,他们也会被视为字符串,这一点和大部分的编程语言不同。要想让数字计算发挥作用,必须使用数学计算命令。Shell中常用的数学计算命令如下表所示。
运算操作符/运算命令 | 说明 |
---|---|
(()) | 用于整数运算,效率很高,推荐使用 |
let | 用于整数运算,和(())类似 |
$[] | 用于整数运算,不如(())灵活 |
expr | 可用于整数运算,也可以处理字符串。比较麻烦,需要注意各种细节,不推荐使用 |
bc | Linux下的一个计算器程序,可以处理整数和小数。Shell本身值支持整数运算,想计算小数就得使用bc这个外部的计算器。 |
declare -i | 将变量定义为整数,然后在进行数学运算时就不会被当成字符串了。功能有限,仅支持最基本的数学运算(加减乘除和取余),不支持逻辑运算、自增自减,所以在实际开发者很少使用。 |
(( expression ))
计算算数表达式,如果表达式的值非零,则返回状态为0;否则返回状态为1.完全等价于 let "expression" 。
- # 整数运算
- ((1+1))
-
- # echo $? 上一条语句的结果
- echo $?
-
-
- # 执行结果为0,因为1+1不等于0,所以 ((1+1))这条语句的返回状态为0
- 0
表达式也可以有多个,有多个表达式时用逗号隔开 ((exp1,exp2))。当执行多个表达式时,根据最后一个表达式的值来判断(())命令的执行状态。
可以使用 $ 来获取 (()) 执行的算数表达式的结果:
- # 查看1+1等于几
- echo $((1+1))
- # 查看2的三次方等于几
- echo $((2**3))
-
-
- # 执行结果
- 2
- 8
也可以用比较运算符:
- # 比较运算符
- a=1
- b=2
- echo $((a
- echo $((a>b))
-
- # 执行结果
- # 布尔值true返回1,false返回0
- 1
- 0
也可以这么玩,类似于三元表达式:a
- # a
- a=1
- b=2
- ((a
-
-
- # 执行结果
- 2
- 2
(2)let
let内建函数允许对shell变量执行算数运算。如果最后一个表达式的计算结果为0,let返回1;否则返回0。
命令格式如下:
let expression [expression ...]
与 (()) 不同的是,let 使用空格来分隔多个表达式。并且对于 x+y 这样的表达式,let 只会计算但不会保存结果,可以通过 let var=x+y 的方式将 x+y 的结果保存到变量 var 中。
后面的不常用,大家就自行扩展叭~
四、条件结构
shell中也有流程控制条件分支语句,格式与python有点类似。
语法如下:
(1)if-then-fi(单分支)
(2)if-then-else-fi(二分支)
(3)if-then-elif-else-fi(多分支)
五、条件运算
在shell中可以通过 test,或者 [[]] 关键字来检查某个条件是否成立。通常与if语句一起使用。
test命令有很多选项,可以进行数值、字符串和文件三个方面的检测。
Shell test 命令的格式为:
test expression
当test判断expression成立时,退出状态为0,否则为1。
test命令也可以简写为 [],它的格式为:
[ expression ]
注意 [] 和 expression之间的空格,这两个空格是必须的,否则会导致语法错误。 []的写法更加简洁,比 test 使用频率高。
test 和 []是等价的。
使用 test命令进行数值比较的案例:
六、文件检测选项
(1)文件类型的判断
我们演示一个,其他的就不演示啦~
(2)文件权限的判断
(3)文件比较
(4)数值比较
(5)字符串比较
我们举个栗子,其他的童鞋们自己去练练哈。
TODO:在Shell中,他们只能用来比较字符串,不能比较数字,有C语言,Python、Java等变成经验的小伙伴们要注意了!!!
(6)逻辑运算
七、在test中使用变量建议用双引号包围起来
test 和 [ ] 都是命令,一个命令本质上对应一个程序或者一个函数。即使是一个程序,它也有入口函数,例如C语言程序的入口函数是main(),运行C语言程序就从main()函数开始,所以也可以将一个程序等效为一个函数,这样我们就不用再区分函数和程序了,直接将一个命令和一个函数对应起来即可。
有了以上认知,就很容易看透命令的本质了:使用一个命令其实就是调用一个函数,命令后面附带的选项和参数最终都会作为实参传递给函数。
假设test命令对应的函数是func(),使用 test -z $str1 命令时,会先将变量 $str1 替换成字符串:
-
相关阅读:
动态加权平衡损失:深度神经网络的类不平衡学习和置信度校准
污水处理厂3D数字孪生三维可视系统降低设备风险隐患
聚观早报 | 羊了个羊幕后推手月流水曾破亿;雷军卸任小米董事长
Nginx之静态文件服务器的搭建
【防作弊】Unity防本地调时间作弊
从20s优化到500ms,我用了这三招
为什么开源大模型终将胜出?
IO流的字符流+对象流+打印流+内存流+随机访问流(2)
activiti-image-generator
C++面向对象编程(3)——常用关键字介绍(TODO)
-
原文地址:https://blog.csdn.net/Sean_0819/article/details/126843561