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.简介 在性能测试中,有时需要模拟一种实际生产中经常出现的情况,即:从某个值开始不断增加压力,直至达到某个值,然后持续运行一段时间,然后继续加压达到某个值持续运行,如此循环直到达到预期的峰值,运行一 ...
随机推荐
- Linux下Shell重定向
1. 标准输入,标准输出与标准错误输出 Linux下系统打开3个文件,标准输入,标准输出,标准错误输出. 标准输入:从键盘输入数据,即从键盘读入数据. 标准输出:把数据输出到终端上. 标准错误输出:把 ...
- Linux服务器运维基本命令
========Linux 服务器常用命令================ cd / 根目录cd ../ 上级目录 ls 列出文件目录 clear 清空控制台tar cvzf name.C ...
- 多阶段构建Docker镜像
在Docker 17.05及更高的版本中支持支持一种全新的构建镜像模式:多阶段构建: 多阶段构建Docker镜像的最大好处是使构建出来的镜像变得更小: 目前常见的两个构建镜像的方式为: 1.直接使用某 ...
- docker 数据卷管理
在生产环境中使用docker,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这涉及到容器对数据管理的操作 容器对数据的管理主要有两种方式: 数据卷(Data Volumes): 容器内 ...
- 【转载】看StackOverflow如何用25台服务器撑起5.6亿的月PV
问答社区网络 StackExchange 由 100 多个网站构成,其中包括了 Alexa 排名第 54 的 StackOverflow.StackExchang 有 400 万用户,每月 5.6 亿 ...
- spring的定时器
一:基于xml配置的方式 1:编写普通的pojo 类 package com.aflyun.web.task; import org.springframework.stereotype.Compon ...
- Java构造方法、成员变量初始化以及静态成员变量初始化三者的先后顺序是什么样的?
[Java笔试真题]:构造方法.成员变量初始化以及静态成员变量初始化三者的先后顺序是什么样的? [解答]:当类第一次被加载的时候,静态变量会首先初始化,接着编译器会把实例变量初始化为默认值,然后执行构 ...
- js注入攻击
注入攻击一般指用户输入数据导致页面乃至整个网站.服务器异常的情况. 直接看一个例子: <html> <head> <title>Test</title> ...
- [Swift]LeetCode388. 文件的最长绝对路径 | Longest Absolute File Path
Suppose we abstract our file system by a string in the following manner: The string "dir\n\tsub ...
- [Swift]LeetCode671. 二叉树中第二小的节点 | Second Minimum Node In a Binary Tree
Given a non-empty special binary tree consisting of nodes with the non-negative value, where each no ...