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

$符号是元字符之一,所以必须引述外壳以避免特殊处理-

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

觉得文章有用?

点个广告表达一下你的爱意吧 !😁