# sh
regex() {
# Usage: regex "string" "regex"
[[ $1 =~ $2 ]] && printf '%s\n' "${BASH_REMATCH[1]}"
}
语法说明:
使用范例: regex " aaa bbb ccc " "\s{2}(.{3})"
[[ $1 =~ $2 ]]
- 在bash3.0之后,bash内置了regexp ,
=~
就是match匹配; =~
左边为源字符串,右边为pattern,表示以 pattern 对该操作符左边的展开内容进行匹配;- 需要注意的是:当使用单引号或双引号将 pattern 括起来的时候,括起来的 pattern 将会变为一般字符而非正则表达式元字符
即:
[[ " aaa bbb ccc " =~ "\s{2}(.{3})" ]]
不会匹配到任何内容,但由于代码里用的是$2
变量,则不存在这种问题。
"${BASH_REMATCH[1]}"
- bash会将匹配到的结果保存到 BASH_REMATCH 数组中,BASH_REMATCH[0] 表示匹配到的所有内容,BASH_REMATCH[1]–BASH_REMATCH[n] 依次存放匹配到的各个子组
-
() 一个命令组合,相当于一个命令组(括号中的名字在子shell中运行) [root@abenmao ~]# I=123;(echo $I;I=xyz;echo $I;);echo $I 123 xyz 123
-
{} 也是一个命令组合,不过与
()
不同的是,{}
中的命令是在当前shell执行 [root@abenmao ~]# I=123;{ echo $I;I=xyz;echo $I; };echo $I 123 xyz xyz 另外需要注意的是,{}
是一个keyword,所以在命令与两边的{
需用空格隔离,同时使用";"表示命令结束。 -
[]
[]
主要用作条件判断,判断对象包括文件类型和赋值比较, 需要特别注意的是,[
是一个builtin内置命令,故在其中的变量引用或常量,需使用双引号或者单引号括起来, 否则会出现单词分割(Word-Splitting)现象。常见的比较测试如下:
-
数字测试:-eq -ne -lt -le -gt -ge
-
文件测试:-r、-l、-w、-x、-f、-d、-s、-nt、-ot
-
字符串测试:=、!=、-n、-z、>、<
-
逻辑测试:-a、-o、!
-
-
(()) 支持四则运算,等同于let功能
-
[[]]
[[]]
类似于[]
,用于比较功能,但是支持正则表达式;[[]]
为一个keyword,括号与表达式中间必须要有空格进行隔离;[[]]
的逻辑运算符为"&&"、"||",支持逻辑短路。