您的位置:首页 > 其它

鸟哥私房菜 变量内容的删除取代和替换

2013-01-03 09:00 176 查看
变量除了可以直接配置来修改原本的内容之外,有没有办法透过简单的动作来将变量的内容进行微调呢? 举例来说,进行变量内容的删除、取代与替换等!是可以的!我们可以透过几个简单的小步骤来进行变量内容的微调喔! 底下就来试试看!
本小节我们主要介绍变量内容的删除

变量的内容可以很简单的透过几个咚咚来进行删除喔!我们使用 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 ,那你的 MAIL 变量应该是 /var/spool/mail/root 。假设你只想要保留最后面那个档名 (root),前面的目录名称都不要了,如何利用 $MAIL 变量来达成?
答:

题意其实是这样『/var/spool/mail/root』,亦即删除掉两条斜线间的所有数据(最长符合)。这个时候你就可以这样做即可:
[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

如果是两条斜线,那么就变成所有符合的内容都会被取代喔

我们将这部份作个总结说明一下:

变量配置方式

我们将这部份作个总结说明一下:

变量配置方式 说明
${变量#关键词}

${变量##关键词}

若变量内容从头开始的数据符合『关键词』,则将符合的最短数据删除

若变量内容从头开始的数据符合『关键词』,则将符合的最长数据删除

${变量%关键词}

${变量%%关键词}

若变量内容从尾向前的数据符合『关键词』,则将符合的最短数据删除

若变量内容从尾向前的数据符合『关键词』,则将符合的最长数据删除

${变量/旧字符串/新字符串}

${变量//旧字符串/新字符串}

若变量内容符合『旧字符串』则『第一个旧字符串会被新字符串取代』

若变量内容符合『旧字符串』则『全部的旧字符串会被新字符串取代』

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: