Shell表达式与运算符有哪些
admin
2023-08-02 05:00:07
0

3.1 条件表达式

表达式

示例

[ expression ][ 1 -eq 1 ] 
` expression `` 1 -eq 1 `
test expressiontest 1 -eq 1 ,等同于[]

3.2 整数比较符

比较符

描述

示例

-eq,equal等于[ 1 -eq 1 ]为true
-ne,not equal不等于[ 1 -ne 1 ]为false
-gt,greater than大于[ 2 -gt 1 ]为true
-lt,lesser than小于[ 2 -lt 1 ]为false
-ge,greater or equal大于或等于[ 2 -gt 1 ]为true
-le,lesser or equal小于或等于[ 2 -le 1 ]为false

3.3 字符串比较符

运算符

描述

示例

==等于[ "a" == "a"  ]为true
!=不等于[ "a" != "a"  ]为false
>大于,判断字符串时根据ASCII码表顺序,不常用

在[]表达式中:[ 2 \> 1 ]为true

在[[]]表达式中:[[ 2 > 1 ]]为true

在(())表达式中:(( 3 > 2 ))为true

<小于,判断字符串时根据ASCII码表顺序,不常用

在[]表达式中:[ 2 \< 1 ]为false

在[[]]表达式中:[[ 2 < 1 ]]为false

在(())表达式中:(( 3 < 2 ))为false

>=大于等于在(())表达式中:(( 3 >= 2 ))为true
<=小于等于在(())表达式中:(( 3 <= 2 ))为false
-n字符串长度不等于0为真

VAR1=1;VAR2=""

[ -n "$VAR1" ]为true

[ -n "$VAR2" ]为false

-z字符串长度等于0为真

VAR1=1;VAR2=""

[ -z "$VAR1" ]为false

[ -z "$VAR2" ]为true

str字符串存在为真

VAR1=1;VAR2=""

[ $VAR1 ]为true

[ $VAR2 ]为false

需要注意的是,使用-z或-n判断字符串长度时,变量要加双引号。

举例说明:

# [ -z $a ] && echo yes || echo no
yes
# [ -n $a ] && echo yes || echo no
yes
# 加了双引号才能正常判断是否为空
# [ -z "$a" ] && echo yes || echo no
yes
# [ -n "$a" ] && echo yes || echo no
no
# 使用了双中括号就不用了双引号
# [[ -n $a ]] && echo yes || echo no
no
# [[ -z $a ]] && echo yes || echo no
yes

3.4 文件测试

测试符

描述

示例

-e文件或目录存在为真[ -e path ] path存在为true
-f文件存在为真[ -f file_path ] 文件存在为true
-d目录存在为真[ -d dir_path ] 目录存在为true
-r有读权限为真[ -r file_path ] file_path有读权限为true
-w有写权限为真[ -w file_path ] file_path有写权限为true
-x有执行权限为真[ -x file_path ] file_path有执行权限为true
-s文件存在并且大小大于0为真[ -s file_path ] file_path存在并且大小大于0为true

3.5 布尔运算符

运算符

描述

示例

!非关系,条件结果取反[ ! 1 -eq 2 ]为true
-a和关系,在[]表达式中使用[ 1 -eq 1 -a 2 -eq 2 ]为true
-o或关系,在[]表达式中使用[ 1 -eq 1 -o 2 -eq 1 ]为true

3.6 逻辑判断符

判断符

描述

示例

&&逻辑与,在[[]]和(())表达式中或判断表达式是否为真时使用

[[ 1 -eq 1 && 2 -eq 2 ]]为true

(( 1 == 1 && 2 == 2 ))为true

[ 1 -eq 1 ] && echo yes 如果&&前面表达式为true则执行后面的

||逻辑或,在[[]]和(())表达式中或判断表达式是否为真时使用

[[ 1 -eq 1 || 2 -eq 1 ]]为true

(( 1 == 1 || 2 == 2 ))为true

[ 1 -eq 2 ] || echo yes 如果||前面表达式为false则执行后面的

3.7 整数运算

运算符

描述

+加法
-减法
*乘法
/除法
%取余

运算表达式

示例

$(())$((1+1))
$[]$[1+1]

上面两个都不支持浮点运算。

$(())表达式还有一个用途,三目运算:

# 如果条件为真返回1,否则返回0
# echo $((1<0))       
0
# echo $((1>0))
1
指定输出数字:
# echo $((1>0?1:2))   
1
# echo $((1<0?1:2))
2

注意:不支持字符串输出

除了Shell本身的算数运算表达式,还有几个命令支持复杂的算数运算:

命令

描述

示例

let赋值并运算,支持++、--

let VAR=(1+2)*3 ; echo $VAR

x=10 ; y=5

let x++;echo $x 每执行一次x加1

let y--;echo $y 每执行一次y减1

let x+=2 每执行一次x加2

let x-=2 每执行一次x减2

expr乘法*需要加反斜杠转义\*

expr 1 \* 2  运算符两边必须有空格

expr \( 1 + 2 \) \* 2  使用双括号时要转义

bc计算器,支持浮点运算、平方等

bc本身就是一个计算器,可直接输入命令,进入解释器。

echo 1 + 2 |bc 将管道符前面标准输出作为bc的标准输入

echo "1.2+2" |bc

echo "10^10" |bc 

echo 'scale=2;10/3' |bc  用scale保留两位小数点

博客地址:http://lizhenliang.blog.51cto.com

QQ群:323779636 (Shell/Python运维开发群 

由于Shell不支持浮点数比较,可以借助bc来完成需求:

# echo "1.2 < 2" |bc
1
# echo "1.2 > 2" |bc
0
# echo "1.2 == 2.2" |bc
0
# echo "1.2 != 2.2" |bc
1
看出规律了嘛?运算如果为真返回1,否则返回0,写一个例子:
# [ $(echo "2.2 > 2" |bc) -eq 1 ] && echo yes || echo no
yes
# [ $(echo "2.2 < 2" |bc) -eq 1 ] && echo yes || echo no
no

expr还可以对字符串操作:

获取字符串长度:
# expr length "string"
6
截取字符串:
# expr substr "string" 4 6
ing
获取字符在字符串中出现的位置:
# expr index "string" str
1
# expr index "string" i
4
获取字符串开始字符出现的长度:
# expr match "string" s.*
6
# expr match "string" str
3

看到这里,想一想里面所讲的小括号、中括号的用途,是不是有点懵逼了。那我们总结一下!

( )

用途1:在运算中,先计算小括号里面的内容

用途2:数组

用途3:匹配分组

(( ))

用途1:表达式,不支持-eq这类的运算符。不支持-a和-o,支持<=、>=、<、>这类比较符和&&、||

用途2:C语言风格的for(())表达式

$( )执行Shell命令,与反撇号等效
$(( ))

用途1:简单算数运算

用途2:支持三目运算符 $(( 表达式?数字:数字 ))

[ ]条件表达式,里面不支持逻辑判断符
` `条件表达式,里面不支持-a和-o,不支持<=和>=比较符,支持-eq、<、>这类比较符。支持=~模式匹配,也可以不用双引号也不会影响原意,比[]更加通用
$[ ]简单算数运算
{ }对逗号(,)和点点(...)起作用,比如touch {1,2}创建1和2文件,touch {1..3}创建1、2和3文件
${ }

用途1:引用变量

用途2:字符串处理

相关内容

热门资讯

唐驳虎丨SpaceX之后,长征... 作者丨唐驳虎核心提要1. 7月10日,长征十号乙遥一火箭从海南商业航天发射场升空,并成功完成一级海上...
格力电器取得一种列间空调专利,... 国家知识产权局信息显示,珠海格力电器股份有限公司取得一项名为“一种列间空调”的专利,授权公告号CN2...
时隔12年三星重启PC芯片业务... 7月10日消息,时隔12年,三星重新进入PC芯片赛道。据媒体报道,三星System LSI业务部正在...
台风来临前为何会晴热高温?权威... 台风好像总是和“狂风暴雨”联系在一起,但在台风“巴威”来临前,江浙沪为何仍晴热高温呢?江苏省气象台首...
沈阳本地滚筒式输送机定制覆盖哪... 工业输送设备定制的行业背景 现在国内制造业、流通业的智能化升级进程加快,据公开数据显示,2023年国...
商业航天3D打印需求爆发,A股... 7月10日,今年以来,国内主流3D打印服务商纷纷在商业航天展会上亮相,在火箭核心零部件制造领域进行“...
OpenAI最强AI模型:GP... OpenAI 公司今天(7月10日)发布公告,宣布在ChatGPT(聊天机器人)、Codex(主打编...
5G-A,重塑智慧文旅新生态 本报记者 窦瀚洋 游客乘坐电瓶船在浙江杭州西溪国家湿地公园观光。 杨 韬摄(人民视觉) 5G-A...
32岁程序员周末猝死后的200... 在广州视琨电子科技有限公司上班的32岁程序员高广辉于2025年11月29日(周六)猝死。猝死前一周工...
强台风“巴威”逼近台湾,蒋万安... 海峡导报综合报道 强台“巴威”持续逼近台湾,台北市长蒋万安9日晚表示,这次“巴威”台风是25年来暴风...