Shell 模式匹配
2021/11/12 7:14:54
本文主要是介绍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 的值,其中,只有在 pattern 中使用了 * 匹配符号时,%和%%,# 和 ## 才有区别
- 结构中的 pattern 支持通配符如下:
*
:表示零个或多个任意字符?
:表示仅与一个任意字符匹配[...]
:表示匹配中括号里面的字符[!...]
: 表示不匹配中括号里面的字符
字符串提取与替换模式匹配
${variable:num}
表示从 $variable 中提取第 num 个字符到末尾的所有字符。
- 若 num 为正数,从左边 0 处开始提取字符串
- 若 num 为负数,从右边 0 处开始提取字符串(必须使用在冒号后面加空格或一个数字或整个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
这篇关于Shell 模式匹配的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南