Linux Shell 脚本: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
以下表格列出了四种引用方式 −
引用方式 | 说明 |
---|---|
单引号 | 这些引号之间的所有特殊字符都失去了它们的特殊意义。 |
双引号 | 这些引号之间的大多数特殊字符都失去了它们的特殊意义,这些除外 − $ ,
|
反斜杠 | 反斜杠后面的任何字符都会失去其特殊意义 |
反引号 | 反引号之间的任何内容都将被视为命令并将被执行。 |
单引号引用
考虑一个包含许多特殊 shell 字符的 echo 命令 −
echo <-$1500.**>; (update?) [y|n]
在每个特殊字符前面放置一个反斜杠显得既冗长又难于阅读 −
echo \<-\$1500.\*\*\>\; \(update\?\) \[y\|n\]
有一个简单的方法来引用大量的元字符组。在字符串的开头和结尾各放置一个单引号 '
−
echo '<-$1500.**>; (update?) [y|n]'
单引号中的元字符被引用,就像反斜杠在每个字符前面起到的作用一样。 这样, echo 命令将正确的显示。
如果需要输出的字符串中出现单引号,则不应将整个字符串放在单个引号中,而应使用反斜杠 \
放置在单引号之前,如下所示 −
echo 'It\'s Shell Programming
双引号引用
尝试执行下面使用单引号引用的 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
推荐文章: