Bourne again shell (bash) 基本编程 5
f
fo MATCHES *fo
foo
food
foodf
foodfo MATCHES *fo
foodfor
foodfort
foodforth
foodfortho
foodforthou
foodforthoug
foodforthought
foodforthought.j
foodforthought.jp
foodforthought.jpg
在搜索了匹配的字符串之后,可以看到 bash 找到两个匹配。它选择最长的匹配,从初始字
符串的开始处除去,然后返回结果。
上面所示的第二个变量扩展形式看起来与第一个相同,但是它只使用一个 "#" -- 并且 bash
执行几乎同样的过程。它查看与第一个例子相同的子字符串系列,但是 bash 从初始字符串
除去最短的匹配,然后返回结果。所以,一查到 "fo" 子字符串,它就从字符串中除去
"fo",然后返回 "odforthought.jpg"。
这样说可能会令人十分困惑,下面以一简单方式记住这个功能。当搜索最长匹配时,使用 #
#(因为 ## 比 # 长)。当搜索最短匹配时,使用 #。看,不难记吧!等一下,怎样记住应
该使用 '#' 字符来从字符串开始部分除去?很简单!注意到了吗:在美国键盘上,shift-4 是
"$",它是 bash 变量扩展字符。在键盘上,紧靠 "$" 左边的是 "#"。这样,可以看到:"#"
位于 "$" 的“开始处”,因此(根据我们的记忆法),"#" 从字符串的开始处除去字符。您
可能要问:如何从字符串末尾除去字符。如果猜到我们使用美国键盘上紧靠 "$" 右边的字符
("%),那就猜对了。这里有一些简单的例子,解释如何截去字符串的末尾部分:
$ MYFOO="chickensoup.tar.gz"
$ echo ${MYFOO%%.*}
chickensoup
$ echo ${MYFOO%.*}
chickensoup.tar
正如您所见,除了将匹配通配符从字符串末尾除去之外,% 和 %% 变量扩展选项与 # 和 #
# 的工作方式相同。请注意:如果要从末尾除去特定子字符串,不必使用 "*" 字符:
MYFOOD="chickensoup"
$ echo ${MYFOOD%%soup}
chicken
在此例中,使用 "%%" 或 "%" 并不重要,因为只能有一个匹配。还要记住:如果忘记了应
该使用 "#" 还是 "%",则看一下键盘上的 3、4 和 5 键,然后猜出来。
可以根据特定字符偏移和长度,使用另一种形式的变量扩展,来选择特定子字符串。试着在
bash 中输入以下行:
Edited by Foxit Reader
Copyright(C) by Foxit Software Company,2005-2008
For Evaluation Only.