Shell从入门到精通进阶之三:表达式与运算符
3.1 条件表达式
表达式 |
示例 |
[ expression ] | [ 1 -eq 1 ] |
` expression ` | ` 1 -eq 1 ` |
test expression | test 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保留两位小数点 |
由于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:字符串处理 |
Shell从入门到精通进阶之三:表达式与运算符的更多相关文章
- Shell从入门到精通进阶之四:流程控制
流程控制是改变程序运行顺序的指令. 4.1 if语句 4.1.1 单分支 if 条件表达式; then 命令 fi 示例: #!/bin/bash N=10 if [ $N -gt 5 ]; then ...
- shell从入门到精通进阶之一:Shell基础知识
1.1 简介 Shell是一个C语言编写的脚本语言,它是用户与Linux的桥梁,用户输入命令交给Shell处理,Shell将相应的操作传递给内核(Kernel),内核把处理的结果输出给用户. 下面是处 ...
- Shell从入门到精通进阶之二:Shell字符串处理之${}
上一章节讲解了为什么用${}引用变量,${}还有一个重要的功能,就是文本处理,单行文本基本上可以满足你所有需求. 2.1 获取字符串长度 # VAR='hello world!' # echo $VA ...
- Jmeter(三十四) - 从入门到精通进阶篇 - 参数化(详解教程)
1.简介 前边三十多篇文章主要介绍的是Jmeter的一些操作和基础知识,算是一些初级入门的知识点,从这一篇开始我们就来学习Jmeter比较高级的操作和深入的知识点了.今天这一篇主要是讲参数化,其实前边 ...
- Jmeter(三十五) - 从入门到精通进阶篇 - 关联(详解教程)
1.简介 上一篇中介绍了如果想要同时发送多条请求,那么怎样才能让每条数据某些请求参数改变呢.这就用到了jMeter参数化.在实际测试场景中,我们往往还有这样的需求,登录后服务器响应的token作为下次 ...
- Shell从入门到精通
熟悉基本shell操作不仅是运维的基本功,对于开发来说也是多多益善,我在学习的过程中,总结了十个练手的小demo,并附上涉及的知识点,仅供娱乐. 1. 多线程ping监控,检查同一网段的IP是否连通 ...
- Jmeter(三十八) - 从入门到精通进阶篇 - 命令行运行JMeter详解(详解教程)
1.简介 前边一篇文章介绍了如何生成测试报告,细心地小伙伴或者同学们可以看到宏哥启动Jmeter生成测试报告不是在gui页面操作的,而是在gui页面设置好保存以后,用命令行来生成测试报告的.这一篇宏哥 ...
- FFmpeg从入门到精通——进阶篇,SEI那些事儿
前言 在直播应用的开发过程中,如果把主播端消息事件传递到观众端,一般会以Instant Messaging(即时通讯)的方式传递过去,但因为消息分发通道和直播通道是分开的,因此消息与直播音视频数据的同 ...
- Jmeter(三十六) - 从入门到精通进阶篇 - 设置负载阶梯式压测场景(详解教程)
1.简介 在性能测试中,有时需要模拟一种实际生产中经常出现的情况,即:从某个值开始不断增加压力,直至达到某个值,然后持续运行一段时间,然后继续加压达到某个值持续运行,如此循环直到达到预期的峰值,运行一 ...
随机推荐
- 2018 Multi-University Training Contest 3 - HDU Contest
题解: solution Code: A. Ascending Rating #include<cstdio> const int N=10000010; int T,n,m,k,P,Q, ...
- 使用curl上传图片的方法
关键:当参数名为"@绝对路径",这时 CURL 會幫你做 multipart/form-data 編碼 实现方法: $params = array( 'file' => '@ ...
- css实现中文换行,英文换行,超出省略
英文换行时,是以单词换行,在对应的标签添加对应的属性即可 1 word-break:break-all;只对英文起作用,以字母作为换行依据 2 word-wrap:break-word; 只对英文起作 ...
- spring ref &history&design philosophy
Spring Framework Overview Spring是开发java application的通用框架,分为多个模块(modules),核心是core container,包括configu ...
- CommonsChunkPlugin
CommonsChunk 插件的作用就是提取代码中的公共代码,然后将公共模块打包到一个独立的文件中,以便在其它的入口和模块中使用,原理就是把多个入口共同的依赖都给定义成一个新入口 多种打包情况: 单一 ...
- python多版本管理工具(pyenv)
在学习和利用python开发的很多情况下,需要多版本的Python并存.此时需要在系统中安装多个Python,但又不能影响系统自带的 Python.pyenv 就是这样一个 Python 版本管理器. ...
- DAY10函数
函数 函数就是可以重复利用的工具 函数可以完成指定代码块,函数就是是存放代码块的容器 函数的有点: 1.避免出现重复冗余的代码 2.让程序代码结构更清晰增加可读性 3 定义函数的语法 1. 函数名:使 ...
- 测试连接失败,因为初始化提供程序时发生错误,[DBNMPNTW] ConnectionOpen (CreateFile())
此主题相关图片如下:错误.jpg 今天发布的程序,在其它电脑上运行没问题,就是其中一台电脑上运程报这个错.系统是Win7的查了好久,最后解决 方法如下: 在报错的电脑上,单击"开始" ...
- ARVE: Augmented Reality Applications in Vehicle to Edge Networks
ARVE:车辆到边缘网中的增强现实应用 本文为SIGCOMM 2018 Workshop (Mobile Edge Communications, MECOMM)论文. 笔者翻译了该论文.由于时间仓促 ...
- Go语言单元测试与基准测试
目录 单元测试 概述 go test参数解读 单元测试日志 基准测试 基础测试基本使用 基准测试原理 自定义测试时间 测试内存 控制计时器 Go语言拥有一套单元测试和性能测试系统,仅需要添加很少的代码 ...