- 本篇主要通过例子陈述两个方面的问题①通过模式处理变量字符串②变量定义的几种特殊形式
- 通过模式处理变量字符串
首先设实验变量为lqx,暂时初值为liuliancao
[[email protected] ~]# lqx="liuliancao" [[email protected] ~]# echo $lqx
liuliancao
eg1.1 位置裁剪${variable:first:length(default to end)}
指定位置裁剪,一直到结尾
[[email protected] ~]# echo ${lqx:3} liancao [[email protected] ~]# echo ${lqx:2} uliancao
指定位置裁剪,裁剪几个字符,如果想要第2-4字符的话,其中1表示从第二个字符开始,默认从0,3表示3个字符
[[email protected] ~]# echo ${lqx:1:3} iul
eg1.2模式裁剪${variable#word} 注意中间没有空格
从字符串开头,开始模式匹配,匹配到的都会被裁剪,留下剩下的,用#表示非贪婪模式(最短模式),通常可以和*使用表示任意字符串
[[email protected] ~]# echo ${lqx#liu} liancao [[email protected] ~]# echo ${lqx#*i} uliancao
贪婪模式,直觉性地想,写两个#,学过正则的估计知道,贪婪模式,是最大程度匹配
[[email protected] ~]# echo ${lqx##*i}
ancao
从尾部,我们使用%,贪婪模式double,这里提醒下,当我们%的时候,怎么写模式呢,从正面写哦,所以写的是a*而不是*a.这句话请仔细体会,并尝试。
从后往前找,尽可能离后面的位置最远的符合模式的全部截掉
[[email protected] ~]# echo ${lqx%%a*}
liuli
从后往前找,第一个即可
[[email protected] ~]# echo ${lqx%a*} liulianc
再举个例子,也为了等会的脚本服务
[[email protected] ~]# tel="0518-777-123-234"
取区号,从前面取的话,必然不行,前面的正是我们需要的,所以从后面取,一直取到最远的连字符
所以
[[email protected] ~]# echo ${tel%%-*} 0518
那么取得后面的号码呢,非贪婪模式,到-结束,对吧
[[email protected] ~]# echo ${tel#*-} 777-123-234
下面写一个根据URL获取域名的一个脚本程序,主要是是否使用贪婪模式,一定要想清楚
分析下思路
一个URL通常由下面的基本格式组成
protocol://host:port/path/index.php?id=1(action)
分析下,必须从后面截取,因为目录也会用到/,而前面的内容是相对的
①先非贪婪截断前面的第一个//然后再从后面截取最后一个看到的/(也即贪婪),然后如果有冒号从后面截取:(非贪婪贪婪无所谓)
[[email protected] shell]# cat url.sh #!/bin/bash #asume that $1 is the URL,and i will find the host _url=$1 echo "orignal url: $_url" #1 reduce protocol _url=${_url#*://} echo " url without protocol: $_url" #2 reduce behind _url=${_url%%/*} echo " url without pro and path: $_url" #3 reduce port _url=${_url%:*} echo " final host: $_url"
运行结果为
[[email protected] shell]# ./url.sh http://www.liuliancao.com:8080/index.php?id=1
orignal url: http://www.liuliancao.com:8080/index.php?id=1
url without protocol: www.liuliancao.com:8080/index.php?id=1
url without pro and path: www.liuliancao.com:8080
final host: www.liuliancao.com
- 变量定义的几种特殊形式
<td vAlign="middle" style="padding-top: 5px; padding-left: 4px; padding-botto
形式 |
说明 |
${var} |
变量本来的值 |
${var:-word} |
如果变量 var 为空或已被删除(unset),那么返回word,但不改变var 的值。 |
${var:=word} |
如果变量 var 为空或已被删除(unset),那么返回 word,并将 var 的值设置为 word。 |
${var:?message} |