系统相关
首页 > 系统相关> > Shell 模式匹配

Shell 模式匹配

作者:互联网

Shell 模式匹配

变量赋值模式匹配

模式匹配在 Shell 脚本中的运用很广泛

举例

[root@node-01 ~]# vim mod.sh
#!/bin/bash

x=${1:-"no parameter"}
echo $x

在上述例子中,x=${1:-"no parameter"} 中的 1:- 可以理解为三元运算符的匹配条件,表达的含义是,如果参数列表中 $1 的值不为空,则 x 值为 $1,否则值为 "no parameter"。

${variable:-string}

若变量 variable 为空,则取 string 的值;若变量 variable 不为空,则取变量 variable 的值

${variable:=string}

若变量 variable 为空,则取 string 的值,并把 string 的值赋给变量 variable: 若变量 variable 不为空,则取变量 variable 的值。${variable:=string} 很常用的一种用法是,判断某个变量是否赋值,没有的话则给它赋上一个默认值。

${var:+string}

若变量 variable 不为空,则取 string 的值;若 variable 为空,则不做处理。

${var:?string}

若变量 variable 不为空,则取 variable 的值;若变量 variable 为空,则把 string 输出到标准错误中,并从脚本中退出。

很常用的一种用法是,利用此特性来检查是否设置了变量的值。

补充扩展:在上面这四种替换结构中 string 不一定是常值的,可用另外一个变量的值或是一种命令的输出。

字符串截取模式匹配
${variable%pattern}

这种模式时,shell 在 variable 中查找,看它是否以给的模式 pattern 结尾,如果是,就从命令行把 variable 中的内容去掉右边最短的匹配模式

[root@node-01 ~]# var=testcase
[root@node-01 ~]# echo $var
testcase
[root@node-01 ~]# echo ${var%s*e} # 从最右边删除最短匹配
testca
${variable%%pattern}

这种模式时,shell在variable中查找,看它是否以给的模式 pattern 结尾,如果是,就从命令行把 variable 中的内容去掉右边最长的匹配模式.

[root@node-01 ~]# var=testcase
[root@node-01 ~]# echo $var
testcase
[root@node-01 ~]# echo ${var%%s*e} # 从最右边删除最长匹配
te
${variable#pattern}

这种模式时,shell 在 variable 中查找,看它是否以给的模式 pattern 开始,如果是,就从命令行把 variable 中的内容去掉左边最短的匹配模式

[root@node-01 ~]# var=testcase
[root@node-01 ~]# echo $var
testcase
[root@node-01 ~]# echo ${var#t*s}
tcase
${variable##pattern}`

这种模式时,shell 在 variable 中查找,看它是否以给的模式 pattern 开始,如果是,就从命令行把 variable 中的内容去掉左边最长的匹配模式

[root@node-01 ~]# var=testcase
[root@node-01 ~]# echo $var
testcase
[root@node-01 ~]# echo ${var##t*s}
e
注意事项
字符串提取与替换模式匹配
${variable:num}

表示从 $variable 中提取第 num 个字符到末尾的所有字符。

[root@node-01 ~]# var=testcase
[root@node-01 ~]# echo $var
testcase
[root@node-01 ~]# echo ${var:2} #从左边第二个字符开始提取字符串
stcase
[root@node-01 ~]# echo ${var: -2} #从右边第二个字符开始提取字符串
se
[root@node-01 ~]# echo ${var:0-2} #从右边第二个字符开始提取字符串
se
[root@node-01 ~]# echo ${var:(-2)} #从右边第二个字符开始提取字符串
se
${variable:num1:num2}

表示从 $variable 字符串的第 num1 个位置开始提取长度为 num2 的子串,且不能为负数。(num1 是位置,num2 是长度)

[root@node-01 ~]# var=testcase
[root@node-01 ~]# echo $var
testcase
[root@node-01 ~]# echo ${var:0:4}
test
${variable/pattern/pattern}

表示从 $variable 字符串的第一个匹配的 pattern 替换为另一个 pattern

[root@node-01 ~]# var=testcase
[root@node-01 ~]# echo $var
testcase
[root@node-01 ~]# echo ${var/s/o}
teotcase
${variable//pattern/pattern}

表示从 $variable 字符串中的所有能匹配的 pattern 替换为另一个 pattern

[root@node-01 ~]# var=testcase
[root@node-01 ~]# echo $var
testcase
[root@node-01 ~]# echo ${var//s/o}
teotcaoe

标签:node,Shell,echo,var,01,variable,root,模式匹配
来源: https://www.cnblogs.com/zkatr/p/15539141.html