Shell-3¶
引号¶
-
单引号
'':字符全部视为普通字符,不会转义 -
双引号
"":字符部分视为普通字符,变量 会被转义 -
反引号 :字符 视为命令,执行后替换将结果替换原字符
-
$(命令):执行命令后将结果输出
Example
条件表达式¶
| 表达式 | 实例 |
|---|---|
[ expression ] |
[ 1 -eq 1 ] |
[[ expression ]] |
[[ 1 -eq 1 ]] |
test expression |
test 1 -eq 1 ,等同于[ 1 -eq 1 ] |
整数比较符¶
| 比较符 | 描述 | 示例 |
|---|---|---|
-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 -ge 1 ]为 true |
-le,lesser or equal |
小于或等于 | [ 2 -le 1 ]为 false |
字符串比较符¶
| 运算符 | 描述 | 示例 |
|---|---|---|
| == | 等于 | [ "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 判断字符串长度时,变量要加双引号。
Example
需要加上双引号才能正常判断
eg:
如果使用双中括号就不需要加双引号
Example
布尔运算符和逻辑运算符¶
| 运算符 | 描述 | 示例 |
|---|---|---|
| ! | 非关系,条件结果取反 | [ ! 1 -eq 2 ] 为 true |
| -a | 与关系,在[]表达式中使用 |
[ 1 -eq 1 -a 2 -eq 2 ] 为 true |
| -o | 或关系,在[]表达式中使用 |
[ 1 -eq 1 -o 2 -eq 1 ] 为 true |
| && | 逻辑与 在 [[]] 和 (()) 表达式中或判断表达式是否为真时使用 |
[[ 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 则执行后面打印 yes |
运算表达式¶
整数运算符¶
| 运算符 | 描述 |
|---|---|
| + | 假发 |
| - | 减法 |
| * | 乘法 |
| / | 除法 |
| % | 取余 |
运算表达式¶
| 运算表达式 | 示例 | 备注 |
|---|---|---|
$(()) |
$((1+1)) |
可以在括号中赋值给变量 |
$[] |
$[1+1] |
不可以在括号中赋值给变量 |
Example
以上两个运算表达式均 不支持浮点运算。
-
$(())还有另外一个用途:三目运算 -
也可以简化,使用默认值
Example
注意,不支持返回字符串
其他运算工具¶
letexprbc
let¶
赋值并运算
Example
bc¶
Shell 不支持浮点数比较,可以借助 bc 命令来完成
Example
expr¶
expr 可以对字符串操作
-
获取字符串长度
Example
-
截取字符串
Example
这里下标从 1 开始,且左包含+右包含。
-
获取字符在字符串中的位置
这里只返回字符在字符串中最先出现的位置
-
获取从头匹配长度
复合命令¶
使用复合命令,可以将多条指令组合在一起执行
{} 形式¶
以 {} 括起来的命令在本 shell 内执行,括号内的命令会改变本 shell 的变量值及工作目录。
注意
{ 后需有一个空格
} 前需有一个分号 ;
Example
() 形式¶
以 () 括起来的命令在子 shell 内执行,括号内的命令不会改变本 shell 的变量值及工作目录。
Tip
( 后无需空格
) 前无需空格
Example
括号用途总结¶
-
圆括号
():- 用途1:在运算中,先计算小括号里的内容
- 用途2:数组
- 用途3:正则匹配分组
- 用途4:在子 Shell 内执行命令
(()):- 用途1:表达式,不支持
-eq、-a、-o这类运算符,支持<=、==、&&、||这类比较符。 - 用途2:C语言风格的
for(())表达式
- 用途1:表达式,不支持
$():执行 Shell 命令,与反撇号等效$(()):- 用途1:简单算术运算
- 用途2:三目运算
$((expression?num:num))
-
方括号
[]:条件表达式,不支持逻辑判断符&& 、||[[]]:条件表达式,不支持-a、-o、>=、<=,支持-eq、>、<这类比较符。可以不用双引号,更通用。$[]:简单算术运算,不支持逻辑比较。
-
花括号
{}:对逗号,和点点..起作用touch {a,b}:创建 a 和 b 两个文件touch {1..4}:创建 1、2、3、4 四个文件- 用途2:在本 Shell 内执行命令
${}:- 用途1:引用变量
- 用途2:字符串处理