Unix 简明教程
Unix / Linux - Shell Quoting Mechanisms
在本章中,我们将详细讨论 Shell 引用机制。我们将从讨论元字符开始。
The Metacharacters
Unix Shell 提供了各种元字符,在任何 Shell 脚本中使用它们时都具有特殊含义,并且会导致某个单词终止,除非加引号。
例如, ? 与目录中列出的单个字符匹配,而 * 与多个字符匹配。以下是大多数 shell 特殊字符(也称为元字符)的列表 −
* ? [ ] ' " \ $ ; & ( ) | ^ < > new-line space tab
通过在字符前加上 \ 可以引用一个字符(即,使它代表自身)。
Example
以下示例显示了如何打印 * 或 ? −
#!/bin/sh
echo Hello; Word
执行后,您会收到以下结果 −
Hello
./test.sh: line 2: Word: command not found
shell returned 127
我们现在尝试使用一个带引号的字符 −
#!/bin/sh
echo Hello\; Word
执行后,您会收到以下结果 −
Hello; Word
$ 符号是元字符之一,因此必须加上引号以避免 shell 对其进行特殊处理 −
#!/bin/sh
echo "I have \$1200"
执行后,您会收到以下结果 −
I have $1200
下表列出了四种引用形式 −
Sr.No. |
Quoting & Description |
1 |
Single quote 这些引号之间的所有特殊字符都会失去其特殊含义。 |
2 |
Double quote 这些引号之间的大多数特殊字符都会失去其特殊含义,但以下情况例外 −$`\$\'\"\\ |
3 |
Backslash 任何紧跟反斜槓之后的字符都将失去其特殊含义。 |
4 |
Back quote 嵌入反引号中的任何内容都将被视为命令并被执行。 |
The Single Quotes
考虑一个包含许多特殊 shell 字符的 echo 命令−
echo <-$1500.**>; (update?) [y|n]
在每个特殊字符前放置反斜杠既繁琐又增加了阅读的难度−
echo \<-\$1500.\*\*\>\; \(update\?\) \[y\|n\]
有一种简单的方法可以引用一大组字符。在字符串的开头和结尾处放置单引号(')−
echo '<-$1500.**>; (update?) [y|n]'
单引号中的字符就像在每个字符前加上反斜杠一样被引用。使用这种方法,echo 命令可以正常显示。
如果字符串中出现单引号需要输出,你不应该将整个字符串放在单引号中,而应在该字符前加上反斜杠(\),如下所示−
echo 'It\'s Shell Programming
The Double Quotes
尝试执行以下 shell 脚本。此 shell 脚本使用了单引号−
VAR=ZARA
echo '$VAR owes <-$1500.**>; [ as of (`date +%m/%d`) ]'
执行后,您会收到以下结果 −
$VAR owes <-$1500.**>; [ as of (`date +%m/%d`) ]
这不是预期要显示的内容。很明显,单引号可以防止变量替换。如果你希望替换变量值并让引号正常工作,那么你需要将命令放入双引号中,如下所示−
VAR=ZARA
echo "$VAR owes <-\$1500.**>; [ as of (`date +%m/%d`) ]"
执行后,您会收到以下结果 −
ZARA owes <-$1500.**>; [ as of (07/02) ]
双引号消除了除以下字符之外所有字符的特殊含义−
-
$ for parameter substitution
-
Backquotes for command substitution
-
\$ 启用字面美元符号
-
\` 启用字面反引号
-
\" 启用嵌入双引号
-
\\ 启用嵌入反斜杠
-
所有其他 \ 字符都是字面的(非特殊)
单引号中的字符就像在每个字符前加上反斜杠一样被引用。这有助于 echo 命令正确显示。
如果字符串中出现单引号需要输出,你不应该将整个字符串放在单引号中,而应在该字符前加上反斜杠(\),如下所示−
echo 'It\'s Shell Programming'