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) ]

双引号消除了除以下字符之外所有字符的特殊含义−

  1. $ for parameter substitution

  2. Backquotes for command substitution

  3. \$ 启用字面美元符号

  4. \` 启用字面反引号

  5. \" 启用嵌入双引号

  6. \\ 启用嵌入反斜杠

  7. 所有其他 \ 字符都是字面的(非特殊)

单引号中的字符就像在每个字符前加上反斜杠一样被引用。这有助于 echo 命令正确显示。

如果字符串中出现单引号需要输出,你不应该将整个字符串放在单引号中,而应在该字符前加上反斜杠(\),如下所示−

echo 'It\'s Shell Programming'

The Backquotes

将任何 Shell 命令放入 backquotes 中会执行该命令。

Syntax

以下是将任何 Shell command 放入反引号中的简单语法−

var=`command`

Example

在以下示例中, date 命令被执行,而产生的结果存储在 DATA 变量中。

DATE=`date`

echo "Current Date: $DATE"

执行后,您会收到以下结果 −

Current Date: Thu Jul  2 05:28:45 MST 2009