1. 变量替换
语法 | 说明 |
---|---|
${变量#匹配规则} |
从变量开头进行规则匹配,将符合最短的数据删除 |
${变量##匹配规则} |
从变量开头进行规则匹配,将符合最长的数据删除【贪婪模式】 |
${变量%匹配规则} |
从变量尾部进行规则匹配,将符合最短的数据删除 |
${变量%%匹配规则} |
从变量尾部进行规则匹配,将符合最长的数据删除【贪婪模式】 |
${变量/旧字符串/新字符串} |
变量内容符合旧字符串,则第一个旧字符串会被新字符串取代 |
${变量//旧字符串/新字符串} |
变量内容符合旧字符串,则全部的旧字符串会被新字符串取代 |
1 | [chao@localhost ~]$ var1="I love you, Do you love me" |
2. 字符串相关操作
- 计算字符串的长度
语法 | 说明 |
---|---|
${#变量} |
- |
expr length "$变量" |
若字符串变量有空格,则必须加双引号 |
1 | [chao@localhost ~]$ echo ${#var1} |
- 字符串其他操作
语法 | 说明 |
---|---|
expr index $变量 $子串(变量或值) |
获取字符索引的位置,从字串的第一个字符开始匹配,只要有一个字符匹配到了就返回对应的坐标 |
expr match $变量 $子串 |
计算子串长度,从头开始匹配,若从头匹配不上,从中间任何一个位置匹配返回都是0,也就是未匹配到 |
1 | [chao@localhost ~]$ echo `expr index "$var1" love` |
- 抽取子串
语法 | 说明 |
---|---|
${变量:下标} |
从变量中的指定下标开始 |
${变量:下标:length} |
从指定下标开始,匹配长度为length |
${变量: -下标} |
从右边指定下标开始匹配 注意冒号和负号中间有空格 |
${变量:(下标)} |
从右边指定下标开始匹配 |
expr substr $变量 $下标 $length |
从指定下标开始,匹配长度为length |
1 | [chao@localhost ~]$ echo ${var1:10} |
3. 命令替换
Shell命令替换是指将命令的输出结果赋值给某个变量,有两种方式:一种是反引号`
,一种是$()。
语法 | 说明 |
---|---|
变量=`命令` |
可以只有一个命令,也可以有多个命令,多个命令之间以分号;分隔 |
变量=$(命令) |
同上 |
1 | 根据系统时间计算今年或明年 |
1 | 判定nginx进程是否存在,若不存在则自动拉起该进程 |
4. 设置变量类型
declare 和 typeset 都是 Shell 内建命令,它们的用法相同,都用来设置变量的属性。不过 typeset 已经被弃用了,建议使用 declare 代替。
declare 命令的用法:declare [+/-] [选项] [变量名=变量值]
,其中,-
表示设置属性,+
表示取消属性,其具体含义如下表:
选项 | 含义 |
---|---|
-f [name] | 列出之前由用户在脚本中定义的函数名称和函数体。 |
-F [name] | 仅列出自定义函数名称。 |
-g name | 在 Shell 函数内部创建全局变量。 |
-p [name] | 显示指定变量的属性和值。 |
-a name | 声明变量为普通数组。 |
-A name | 声明变量为关联数组(支持索引下标为字符串)。 |
-i name | 将变量定义为整数型。 |
-r name[=value] | 将变量定义为只读(不可修改和删除),等价于 readonly name。 |
-x name[=value] | 将变量设置为环境变量,等价于 export name[=value]。 |
1 | declare -r 将变量设为只读,再赋值就会报错 |
5. 数学运算
算术运算符 | 说明/含义 |
---|---|
+、- | 加法(或正号)、减法(或负号) |
*、/、% | 乘法、除法、取余(取模) |
** | 幂运算 |
++、– | 自增和自减,可以放在变量的前面也可以放在变量的后 |
!、&&、|| | 逻辑非(取反)、逻辑与(and)、逻辑或(or) |
<、<=、>、>= | 比较符号(小于、小于等于、大于、大于等于) |
==、!=、= | 比较符号(相等、不相等;对于字符串,= 也可以表示相当于) |
<<、>> | 向左移位、向右移位 |
~、|、 &、^ | 按位取反、按位或、按位与、按位异或 |
=、+=、-=、*=、/=、%= | 赋值运算符,例如 a+=1 相当于 a=a+1,a-=1 相当于 a=a-1 |
在Shell中,如果不特别指明,每一个变量的值都是字符串,无论你给变量赋值时有没有使用引号,值都会以字符串的形式存储。
1 | [chao@localhost ~]$ echo 2+8 |
5.1 数学运算命令
Shell中常用的六种数学计算方式:
运算操作符/运算命令 | 说明 |
---|---|
(( )) |
用于整数运算,效率很高,推荐使用。 |
let |
用于整数运算,和 (()) 类似。 |
$[] |
用于整数运算,不如 (()) 灵活。 |
expr |
可用于整数运算,也可以处理字符串。 |
bc |
Linux下的一个计算器程序,可以处理整数和小数。Shell 本身只支持整数运算,想计算小数就得使用 bc 这个外部的计算器。 |
declare -i |
将变量定义为整数,然后再进行数学运算时就不会被当做字符串了。功能有限,仅支持最基本的数学运算(加减乘除和取余),不支持逻辑运算、自增自减等,所以在实际开发中很少使用。 |
1 | expr 计算,注意>,*等运算需要转义 |
bc
是bash内建的运算器,支持浮点数运算,内建变量scale可以设置精确度(默认为0),操作符^
用于指数运算。
1 | [chao@localhost ~]$ echo "3*8"|bc |