变量除了可以直接配置来修改原本的内容之外,有没有办法透过简单的动作来将变量的内容进行微调呢? 举例来说,进行变量内容的删除、取代与替换等!是可以的!我们可以透过几个简单的小步骤来进行变量内容的微调喔! 底下就来试试看!
本小节我们主要介绍变量内容的删除
变量的内容可以很简单的透过几个咚咚来进行删除喔!我们使用 PATH 这个变量的内容来做测试好了
范例一:先让小写的 path 自定义变量配置的与 PATH 内容相同
[root@SOR_SYS ~]# path=${PATH}
[root@SOR_SYS ~]# echo $path
/usr/local/ruby-1.8.7-p330/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin
:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/jdk1.6.0_05/bin:/usr/local/maven/bin:/root/bin
:/usr/local/jdk1.6.0_05/bin:/usr/local/maven/bin #这三行是一行!
范例二:假设我不喜欢 kerberos,所以要将这两个目录删除掉,如何显示?
[root@SOR_SYS ~]#echo ${path#/*kerberos/bin:}
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/jdk1.6.0_05/bin
:/usr/local/maven/bin:/root/bin:/usr/local/jdk1.6.0_05/bin:/usr/local/maven/bin 这两行是一行!
上面这个范例很有趣的!他的重点可以用底下这张表来说明:
${variable#/*kerberos/bin:}
上面的特殊字体部分是关键词!用在这种删除模式所必须存在的
${variable#/*kerberos/bin:}
这就是原本的变量名称,以上面范例二来说,这里就填写 path 这个『变量名称』啦
${variable#/*kerberos/bin:}
这是重点!代表『从变量内容的最前面开始向右删除』,且仅删除最短的那个
${variable#/*kerberos/bin:}
代表要被删除的部分,由于 # 代表由前面开始删除,所以这里便由开始的 / 写起。
需要注意的是,我们还可以透过通配符 * 来取代 0 到无穷多个任意字符
以上面范例二的结果来看, path 这个变量被删除的内容如下所示:
/usr/local/ruby-1.8.7-p330/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin
:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/jdk1.6.0_05/bin
:/usr/local/maven/bin:/root/bin:/usr/local/jdk1.6.0_05/bin:/usr/local/maven/bin <==这三行其实是同一行啦!
例子:
[root@SOR_SYS ~]# echo ${path#/*jdk1.6.0_05/bin:}
/usr/local/maven/bin:/root/bin:/usr/local/jdk1.6.0_05/bin:/usr/local/maven/bin这是重点!代表『从变量内容的最前面开始向右删除』,且仅删除最短的那个
刚开始一直不明白什么意思,然后正好想在不是有两个jdk的目录嘛,然后就测试了一下,大家看看结果就应该明白了,吼吼~~
很有趣吧!这样了解了 # 的功能了吗?接下来让我们来看看底下的范例三!
范例三:我想要删除前面所有的目录,仅保留最后一个目录
[root@SOR_SYS ~]# echo ${path#/*:}
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin
:/usr/bin:/usr/local/jdk1.6.0_05/bin:/usr/local/maven/bin:/root/bin
由于一个 # 仅删除掉最短的那个,因此他删除的情况可以用底下的删除线来看:
/usr/local/ruby-1.8.7-p330/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin
:/usr/bin:/usr/local/jdk1.6.0_05/bin:/usr/local/maven/bin:/root/bin
[root@SOR_SYS ~]# echo ${path##/*:}
/root/bin
嘿!多加了一个 # 变成 ## 之后,他变成『删除掉最长的那个数据』!亦即是:
/usr/local/ruby-1.8.7-p330/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin
:/usr/bin:/usr/local/jdk1.6.0_05/bin:/usr/local/maven/bin:/root/bin
非常有趣!不是吗?因为在 PATH 这个变量的内容中,每个目录都是以冒号『:』隔开的, 所以要从头删除掉目录就是介于斜线 (/) 到冒号 (:) 之间的数据!但是 PATH 中不止一个冒号 (:) 啊! 所以 # 与 ## 就分别代表:
# :符合取代文字的『最短的』那一个;
##:符合取代文字的『最长的』那一个
上面谈到的是『从前面开始删除变量内容』,那么如果想要『从后面向前删除变量内容』呢? 这个时候就得使用百分比 (%) 符号了!来看看范例四怎么做吧!
范例四:我想要删除最后面那个目录,亦即从 : 到 bin 为止的字符串
[root@SOR_SYS ~]# echo ${path%:*bin}
/usr/local/ruby-1.8.7-p330/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin
:/usr/bin:/usr/local/jdk1.6.0_05/bin:/usr/local/maven/bin
这个 % 符号代表由最后面开始向前删除!所以上面得到的结果其实是来自如下:
/usr/local/ruby-1.8.7-p330/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin
:/usr/bin:/usr/local/jdk1.6.0_05/bin:/usr/local/maven/bin:/root/bin
范例五:那如果我只想要保留第一个目录呢?
[root@SOR_SYS ~]# echo ${path%%:*bin}
/usr/local/ruby-1.8.7-p330/bin
同样的, %% 代表的则是最长的符合字符串,所以结果其实是来自如下:
/usr/local/ruby-1.8.7-p330/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin
:/usr/bin:/usr/local/jdk1.6.0_05/bin:/usr/local/maven/bin:/root/bin
由于我是想要由变量内容的后面向前面删除,而我这个变量内容最后面的结尾是『/root/bin』, 所以你可以看到上面我删除的数据最终一定是『bin』,亦即是『:*bin』那个 * 代表通配符! 至于 % 与 %% 的意义其实与 # 及 ## 类似!这样理解否?
例题:
答:
[root@SOR_SYS ~]# echo ${MAIL##/*/}
root
相反的,如果你只想要拿掉文件名,保留目录的名称,亦即是『/var/spool/mail/root』 (最短符合)。但假设你并不知道结尾的字母为何,此时你可以利用通配符来处理即可,如下所示:
[root@SOR_SYS ~]# echo ${MAIL%/*}
/var/spool/mail
了解了删除功能后,接下来谈谈取代吧!继续玩玩范例六啰!
范例六:将 path 的变量内容内的 sbin 取代成大写 SBIN: [root@SOR_SYS ~]#echo ${path/sbin/SBIN}
/usr/local/ruby-1.8.7-p330/bin:/usr/kerberos/SBIN:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
:/usr/local/jdk1.6.0_05/bin:/usr/local/maven/bin:/root/bin
这个部分就容易理解的多了!关键词在于那两个斜线,两斜线中间的是旧字符串
后面的是新字符串,所以结果就会出现如上述的特殊字体部分啰!
[root@SOR_SYS ~]# echo ${path//sbin/SBIN}
/usr/local/ruby-1.8.7-p330/bin:/usr/kerberos/SBIN:/usr/kerberos/bin:/usr/local/SBIN:/usr/local/bin:/SBIN:/bin:/usr/SBIN:/usr/bin
:/usr/local/jdk1.6.0_05/bin:/usr/local/maven/bin:/root/bin
如果是两条斜线,那么就变成所有符合的内容都会被取代喔
我们将这部份作个总结说明一下:
变量配置方式
我们将这部份作个总结说明一下:
变量配置方式 说明 |
${变量#关键词} ${变量##关键词} | 若变量内容从头开始的数据符合『关键词』,则将符合的最短数据删除 若变量内容从头开始的数据符合『关键词』,则将符合的最长数据删除 |
${变量%关键词} ${变量%%关键词} | 若变量内容从尾向前的数据符合『关键词』,则将符合的最短数据删除 若变量内容从尾向前的数据符合『关键词』,则将符合的最长数据删除 |
${变量/旧字符串/新字符串} ${变量//旧字符串/新字符串} | 若变量内容符合『旧字符串』则『第一个旧字符串会被新字符串取代』 若变量内容符合『旧字符串』则『全部的旧字符串会被新字符串取代』 |