运算符,自然shell作为脚本编程也无法遗漏的地方。
其运算符分为:
- 算数运算符
- 关系运算符
- 字符串运算符
算数运算符
其实shell原生的不支持件的数学运算,所以通过使用其他命令进行首先,比如awk和expr,其中expr是最常见的方式。
具体格式如下:
$((运算式)) 或者 $[运算式] 或者 expr 运算式
#使用expr的时候,运算符间要有空格,
expr m + n
#如果expr的结果赋值给某个变量赋值使用需要使用反引号
k='expr m + n'
具体算数运行,以及对于的意义,不过下面写的==也通过算数运算=演变的运算符,不过其结果式布尔值。
比如 a=10 ;b=20;
运算符 | 说明 | 举例 |
---|---|---|
+ | 加法 | expr $a + $b 结果为 30。 |
- | 减法 | expr $a - $b 结果为 -10。 |
* | 乘法 | expr $a \* $b 结果为 200。 |
/ | 除法 | expr $b / $a 结果为 2。 |
% | 取余 | expr $b % $a 结果为 0。 |
= | 赋值 | a=$b 将把变量 b 的值赋给 a。 |
== | 相等。用于比较两个数字,相同则返回 true。 | [ $a == $b ] 返回 false。 |
!= | 不相等。用于比较两个数字,不相同则返回 true。 | [ $a != $b ] 返回 true。 |
关系运算符
这个在shell中很其他,其支持数字,(如果字符串是纯数字的话也可以使用)。这个很多时候会用在判断语句作为条件使用。
声明两个值a=1,b=2;
运算符 | 说明 | 举例 |
---|---|---|
-eq | 检测两个数是否相等,相等返回 true。 | [ $a -eq $b ] 返回 false。 |
-ne | 检测两个数是否不相等,不相等返回 true。 | [ $a -ne $b ] 返回 true。 |
-gt | 检测左边的数是否大于右边的,如果是,则返回 true。 | [ $a -gt $b ] 返回 false。 |
-lt | 检测左边的数是否小于右边的,如果是,则返回 true。 | [ $a -lt $b ] 返回 true。 |
-ge | 检测左边的数是否大于等于右边的,如果是,则返回 true。 | [ $a -ge $b ] 返回 false。 |
-le | 检测左边的数是否小于等于右边的,如果是,则返回 true。 | [ $a -le $b ] 返回 true。 |
补充:[]
[ 条件 ]
# 条件前后必须有空格
#[ ] 没有条件默认其为false
#[ 数字或字符串 ] 没有关系运算符默认为ture
好奇为什么示例都使用[] ,其是是条件语句格式而已,如果单独使用关系运算符的话,没有if或者while等逻辑运算符会报错。例如
可见其无法单独使用,其使用必须在条件语句中。
逻辑运算符
运算符 | 说明 |
---|---|
&& 或者 -a | 逻辑的 AND |
||或者-o | 逻辑的 OR |
! | 非运算 |
字符串运算符
下面会列出常用的字符串运算符,变量a=”aa“,b=“bb”
运算符 | 说明 | 举例 |
---|---|---|
= | 检测两个字符串是否相等,相等返回true否则false | [ a = a = a=b] 的值 false |
!= | 检测两个字符串是否不相等,不相等返回true,否则返回false | [ a ! = a!= a!=b] 的值 true |
-z | 检测字符串长度是否为0 ,如果0为true,否则返回false | [-z $a] 的值false |
-n | 与-z刚好相反,检测字符串长度是否不为0,如果不为0为true,否则返回false | [-z $a] 的值true |
$ | 检测字符串是否为空,不为空,返回true。 | [$a]值为true |
为什么带有[]这个要求和使用的地方,和关系运算符一样,在if等语句中作为条件使用。
看上面,有一个奇怪的地方,那就是字符是否连接,比如将a和b连接在一起。
#!/bin/bash
a='aa'
b='bb'
c=$a$b #中间不能有空格
c1="$a $b" #如果被双引号包围,就可以有空格
c2="$b;$b" #可以在中间添加其他字符串
c3="$a"cc"$b" # 也可以这样写
c4=${a}cc$b # 也可以这样写
echo $c
echo $c1
echo $c2
echo $c3
echo $c4
为什么c= a a ab中间不能有空格,因为没有被任何一种引号包围,其中的空格对shell命令来说代表这一行的结束
c=$a $b
#echo $c
输出的是aa
字符串变量声明的时候可以不带有引号,shell 默认所以
c3="$a"cc"$b"
#可以这样写
但是注意:
1: 如果两个带有各自的引号,而字符串各自分号这样写 "$a"cc"$b" 或者$a"cc"$b或者"$a""cc""$b"
2: 如果$a被后面cc的话,需要用{}对其范围进行限制比如${a}cc,如果没有{}的存在的话,$acc会选择acc这个变量名。但是如果是特殊 符号比如(: , 等)可以省略{}范围。因为$b后面没有其他的字母,所以没有用{}
字符串操作
-
字符串截取
格式:${字符串变量: 开始位置 : 截取的长度}
其分左侧或右侧开始截图的具体写法
左侧开始:${string: 0-start :length} 右侧开始:${string: 0-start :length} 左侧种格式相比,右侧种格式仅仅多了0-,这是固定的写法,专门用来表示从字符串右边开始计数。
上面只是举例了一个,其实还有多个不同方式的截取
格式 说明 ${string: start :length} 从 string 字符串的左边第 start 个字符开始,向右截取 length 个字符。 ${string: start} 从 string 字符串的左边第 start 个字符开始截取,直到最后。 ${string: 0-start :length} 从 string 字符串的右边第 start 个字符开始,向右截取 length 个字符。 ${string: 0-start} 从 string 字符串的右边第 start 个字符开始截取,直到最后。 ${string#*chars} 从 string 字符串第一次出现 *chars 的位置开始,截取 *chars 右边的所有字符。 ${string##*chars} 从 string 字符串最后一次出现 *chars 的位置开始,截取 *chars 右边的所有字符 ${string%*chars} 从 string 字符串第一次出现 *chars 的位置开始,截取 *chars 左边的所有字符。 ${string%%*chars} 从 string 字符串最后一次出现 *chars 的位置开始,截取 *chars 左边的所有字符。 补充:得到字符串的长度
str="abcd" echo ${#str} #输出 4