在本章中,我们将详细讨论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
该$符号是元字符之一,所以必须引述外壳以避免特殊处理-
#!/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`
例
的日期命令在下面的示例中执行,并且所产生的结果被存储在DATA变量。
DATE=`date`
echo "Current Date: $DATE"
执行后,您将收到以下结果-
Current Date: Thu Jul 2 05:28:45 UTC 2020