📅  最后修改于: 2020-10-31 14:54:58             🧑  作者: Mango
在本章中,我们将详细讨论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
下表列出了四种报价形式-
Sr.No. | Quoting & Description |
---|---|
1 |
Single quote All special characters between these quotes lose their special meaning. |
2 |
Double quote Most special characters between these quotes lose their special meaning with these exceptions −
|
3 |
Backslash Any character immediately following the backslash loses its special meaning. |
4 |
Back quote Anything in between back quotes would be treated as a command and would be executed. |
考虑一个包含许多特殊shell字符的echo命令-
echo ; (update?) [y|n]
在每个特殊字符的前面加上反斜杠很乏味,并且使该行难以阅读-
echo \\; \(update\?\) \[y\|n\]
有一种简单的方法可以引用大量字符。在字符串的开头和结尾处加上单引号(’)-
echo '; (update?) [y|n]'
单引号内的字符被引用,就好像一个反斜杠在每个字符的前面。这样,echo命令将以正确的方式显示。
如果单引号出现在要输出的字符串中,则不应将整个字符串放在单引号中,而应在使用反斜杠(\)之前,如下所示:
echo 'It\'s Shell Programming
尝试执行以下shell脚本。这个shell脚本使用单引号-
VAR=ZARA
echo '$VAR owes ; [ as of (`date +%m/%d`) ]'
执行后,您将收到以下结果-
$VAR owes ; [ as of (`date +%m/%d`) ]
这不是必须显示的内容。显然,单引号可以防止变量替换。如果要替换变量值并使反逗号逗号按预期工作,则需要将命令放在双引号中,如下所示:
VAR=ZARA
echo "$VAR owes ; [ as of (`date +%m/%d`) ]"
执行后,您将收到以下结果-
ZARA owes ; [ 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