博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第三章 Shell表达式与运算符
阅读量:7000 次
发布时间:2019-06-27

本文共 3611 字,大约阅读时间需要 12 分钟。

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 noyes# [ -n $a ] && echo yes || echo noyes# 加了双引号才能正常判断是否为空# [ -z "$a" ] && echo yes || echo noyes# [ -n "$a" ] && echo yes || echo nono# 使用了双中括号就不用了双引号# [[ -n $a ]] && echo yes || echo nono# [[ -z $a ]] && echo yes || echo noyes

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

expr还可以对字符串操作:

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

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

( )

用途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:字符串处理

image.png

转载地址:http://nievl.baihongyu.com/

你可能感兴趣的文章
解决Mac OS 山猫10.8下Xcode无法更新以及速度慢的问题
查看>>
poj 1988 Cube Stacking(并查集)
查看>>
lamp 403
查看>>
关于“鸡脚神”的看法
查看>>
c# 路径空格---ProcessStartInfo参数问题
查看>>
我的MYSQL学习心得(十七) 复制
查看>>
用eclipse建立servlet工程
查看>>
MySql通用分页存储过程
查看>>
LoadRunner脚本回放日志中的Warning信息
查看>>
Surround the Trees(凸包求周长)
查看>>
转载:如何运用VI编辑器进行查找替换
查看>>
android xutils
查看>>
strut2.xml中result param详细设置
查看>>
Mysql注入绕过姿势
查看>>
移动互联网实战--社交游戏的排行榜设计和实现(2)
查看>>
开源工具DbUtils的使用(数据库的增删改查)
查看>>
不要再用if(xxx != null)或者try catch NullPointerException了,Optional可以帮你解决
查看>>
excel读写技术二
查看>>
Panorama控件和Pivot控件【WP7学习札记之十四】
查看>>
dialog shell下的gui设计 代替繁杂libncurses编程
查看>>