在鸟叔的私房菜第四版中的P331讲到了关于变量的内容删除的问题
一开始我就很疑惑,what ???什么意思?
现在我把我的理解写出来。希望可以帮助到跟我有一样疑惑的朋友。
先明确
- # : 是从左边开始删除 ,跟在这个字符后面的内容理解为:遇到这些内容的时候我就把它和它左边的东西全不要。
- % :是从右边开始删除,跟在这个字符后面的内容理解为:遇到这些内容的时候我就把它和它右边的东西全不要。
- *:通配符。
好,接下来
这个path是我的Ubuntu下的,如下图:
path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
e.g.
先给大家讲一个 # 和两个 # 的代码
再讲一个 % 和两个 % 的代码
一、一个 #
-
从左开始删除 #
echo ${path#*/} #删除左边第一条 / 和左边的内容
运行结果:
看到最左边的 / 已经没有了。我的代码里 #*/ 的意思就是:从左开始遇到 / 就删除左边的东西,然后显示剩下的内容。 -
从左边开始删除我不想要的,比如我想把 第一个 bin 和 它左边的内容删掉。比如下图
怎么做?下面三种代码:echo ${path#*bin} #(1) echo ${path#/*bin} #(2) echo ${path#*/bin} #(3)
哪一种?蒙了吧!
别慌!按照我说的慢慢来理解
(1)#*bin
:从左边开始查找,遇到含 bin 字样的就停止,删除。运行结果(我截图截了两行,方便大家对比查看):
咦!是不是跟自己想的不一样?竟然在第一个目录(:是作为分隔目录的符号)的 sbin就停下,然后删除了左边的东西。不过,你看,这不和我说的一样吗?遇到含 bin 字样的就停止,删除。(2)
#/*bin
:从左边开始查找遇到 /xxxxbin的就停止,删除。
运行结果:
这不就和(1)的结果一样嘛。理解也是差不多。(1)是遇到XXXbin就停止,(2)是遇到 /XXXbin 就停止,所以结果是一样的。
(3)
#*/bin
:从左边开始查找,遇到XXX/bin就停止。
运行结果:
嗯~差不多了,不过为什么前面还有个 : 呢?
那是因为遇到XXX/bin就停止了嘛,所以更改为echo ${path#*/bin:} #bin后加多一个:,这样它就是遇到XXX/bin:停止
二、两个 #
我想要输出以下字样呢?怎么解决?
/snap/bin
可通过以下语句:
echo ${path##*games:}
运行结果:
那么究竟什么意思呢?先贴上鸟哥的一句话
- #: 符合替换文字的【最短的】那一个
- ##:符合替换文字的【最长的】那一个
其实两个##和一个#的理解其实是一样的,只不过##是寻找最长的比如:
标号1的框有games的字眼了,但因为使用的是##所以还会寻找2的games作为最终的结果。
三、一个%
这个就是从右边开始删除的符号
-
比如:我想删除最后的目录
:/snap/bin
即显示
可通过以下语句echo ${path%:*}
要理解这个也不难,还是按照我的那个思路:从右边开始找到:(冒号)然后删掉它和它右边的东西。
运行结果:
-
那如果我想显示以下的信息呢?
也很简单,输入以下命令即可:echo ${path%:/sbin*}
理解:从右边开始找找到
:/sbin
字样的就停止,然后删除本身和右边东西。运行结果
四、两个%%
- 我想要输出如图结果 输入以下命令:
理解:从右边开始找寻找echo ${path%%/games*}
/games
字样的,第一次找到了/usr/local/games
,但因为是%%,所有继续找,直到/usr/games
才停下,然后删除
运行结果
以上就是关于鸟哥书上的以下代码的一些帮助你理解的内容了。echo ${path#/*:} echo ${path##/*:} echo ${path%:*bin} echo ${path%%:*bin}