上面所做的称为“命令替换”。此例中有几点需要指出。在第一行,简单地将要执行的命令以 反引号 括起。那不是标准的单引号,而是键盘中通常位于 Tab 键之上的单引号。能够用 bash 备用命令替换语法来做同样的事:
|
如您所见,bash 提供多种方法来执行完全相同的操作。使用命令替换能够将任何命令或命令管道放在 ` ` 或 $( ) 之间,并将其分配给环境变量。真方便!下面是个例子,演示如何在命令替换中使用管道:
|
象专业人员那样截断字符串
尽管 basename 和 dirname 是很好的工具,但有时可能需要执行更高级的字符串“截断”,而不只是标准的路径名操作。当需要更强的说服力时,能够利用 bash 内置的变量扩展功能。已使用了类似于 $ 的标准类型的变量扩展。但是 bash 自身也能够执行一些便利的字符串截断。看一下这些例子:
|
在第一个例子中,输入了 $。他的确切含义是什么?基本上,在 ${ } 中输入环境变量名称,两个 ##,然后是通配符 ("*fo")。然后,bash 取得 MYVAR,找到从字符串 "foodforthought.jpg" 开始处开始、且匹配通配符 "*fo" 的 最长 子字符串,然后将其从字符串的开始处截去。刚开始理解时会有些困难,为了感受一下这个特别的 "##" 选项如何工作,让我们一步步地看看 bash 如何完成这个扩展。首先,他从 "foodforthought.jpg" 的开始处搜索和 "*fo" 通配符匹配的子字符串。以下是检查到的子字符串:
|
在搜索了匹配的字符串之后,能够看到 bash 找到两个匹配。他选择最长的匹配,从初始字符串的开始处除去,然后返回结果。
上面所示的第二个变量扩展形式看起来和第一个相同,但是他只使用一个 "#" -- 并且 bash 执行 几乎 同样的过程。他查看和第一个例子相同的子字符串系列,但是 bash 从初始字符串除去 最短 的匹配,然后返回结果。所以,一查到 "fo" 子字符串,他就从字符串中除去 "fo",然后返回 "odforthought.jpg"。
这样说可能会令人十分困惑,下面以一简单方式记住这个功能。当搜索最长匹配时,使用 ##(因为 ## 比 # 长)。当搜索最短匹配时,使用 #。看,不难记吧!等一下,怎样记住应该使用 '#' 字符来从字符串开始部分除去?很简单!注意到了吗:在美国键盘上,shift-4 是 "$",他是 bash 变量扩展字符。在键盘上,紧靠 "$" 左边的是 "#"。这样,能够看到:"#" 位于 "$" 的“开始处”,因此(根据我们的记忆法),"#" 从字符串的开始处除去字符。您可能要问:如何从字符串末尾除去字符。假如猜到我们使用美国键盘上紧靠 "$" 右边 的字符 ("%),那就猜对了。这里有一些简单的例子,解释如何截去字符串的末尾部分:
|
正如您所见,除了将匹配通配符从字符串末尾除去之外,% 和 %% 变量扩展选项和 # 和 ## 的工作方式相同。请注意:假如要从末尾除去特定子字符串,不必使用 "*" 字符:
|
在此例中,使用 "%%" 或 "%" 并不重要,因为只能有一个匹配。还要记住:假如忘记了应该使用 "#" 还是 "%",则看一下键盘上的 3、4 和 5 键,然后猜出来。
能够根据特定字符偏移和长度,使用另一种形式的变量扩展,来选择特定子字符串。试着在 bash 中输入以下行:




