Unix / Linux - Shell 引用机制

在本章中,我们将详细讨论 Shell 的引用机制。 我们将从讨论元字符开始。


元字符

Unix Shell 提供了各种元字符,这些元字符在任何 Shell 脚本中使用时都具有特殊含义,除非被引用,否则会导致单词终止。

例如,? 在列出目录中的文件时匹配单个字符,而 * 匹配多个字符。 这是大多数 shell 特殊字符(也称为元字符)的列表 −

* ? [ ] ' " \ $ ; & ( ) | ^ < > new-line space tab

可以通过在字符前面加上 \ 来引用字符(即代表其自身)。

示例

以下示例显示如何打印 *?

#!/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

下表列出了四种形式的引用 −

序号 引用 & 描述
1

单引号

这些引号之间的所有特殊字符都失去了它们的特殊含义。

2

双引号

除了这些例外,这些引号之间的大多数特殊字符都失去了它们的特殊含义 −

  • $
  • `
  • \$
  • \'
  • \"
  • \\
3

反斜杠

任何紧跟在反斜杠后面的字符都失去了它的特殊含义。

4

反引号

反引号之间的任何内容都将被视为命令并被执行。


单引号

考虑一个包含许多特殊 shell 字符的 echo 命令 −

echo <-$1500.**>; (update?) [y|n]

在每个特殊字符前加一个反斜杠是乏味的,并且使该行难以阅读 −

echo \<-\$1500.\*\*\>\; \(update\?\) \[y\|n\]

有一种简单的方法可以引用大量字符。 在字符串的开头和结尾放置一个单引号 (') −

echo '<-$1500.**>; (update?) [y|n]'

单引号内的字符就像在每个字符前面加一个反斜杠一样被引用。 这样,echo 命令就会以正确的方式显示。

如果要输出的字符串中出现单引号,则不应将整个字符串放在单引号内,而应在其前面使用反斜杠 (\),如下所示 −

echo 'It\'s Shell Programming

双引号

尝试执行以下 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) ]

双引号带走除以下以外所有字符的特殊含义 −

  • $ 用于参数替换

  • 用于命令替换的反引号

  • \$ 启用文字美元符号

  • \` 启用文字反引号

  • \" 启用嵌入式双引号

  • \\ 启用嵌入式反斜杠

  • 所有其他 \ 字符都是文字(不是特殊的)

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

如果要输出的字符串中出现单引号,则不应将整个字符串放在单引号内,而应在其前面使用反斜杠 (\),如下所示 −

echo 'It\'s Shell Programming'

反引号

将任何 Shell 命令放在 反引号 之间会执行该命令。

语法

这是将任何 Shell 命令 置于反引号之间的简单语法 −

var=`command`

示例

date 命令在下面的例子中执行,产生的结果存储在 DATA 变量中。

DATE=`date`

echo "Current Date: $DATE"

执行后,您将收到如下结果 −

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