Linux shell编程(shell引用机制解读和用法)

上一篇Linux shell编程教程请查看:shell转义或替换介绍和用法
在本章中我们将详细讨论Shell引用机制,下面我们先从讨论元字符开始。
1、元字符Unix Shell提供了各种元字符,这些元字符在任何Shell脚本中使用时都有特殊的意义,除非使用引号否则会导致单词终止。例如?在目录中列出文件时匹配单个字符,*匹配多个字符。
这里列出了大多数shell特殊字符(也称为元字符):

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

可以通过在字符前面加上\来引用字符,下面的示例演示如何打印*或?。
#!/bin/bashecho AA; BB

执行之后将收到以下结果:
Hello ./test.sh: line 2: BB: command not foundshell returned 105

现在让我们尝试使用一个引用字符:
#!/bin/bashecho AA\; BB

以上例子将输出“AA; BB”,另外$符号是元字符之一,因此必须引用它以避免shell的特殊处理:
#!/bin/bashecho "I have \$500"

执行之后我们将得到”I have $500”的正常输出,下表列出了四种形式的引用:
编号 引用 & 描述
1 单引号 所有这些引号之间的特殊字符都失去了它们的特殊意义。
2 双引号 除了这些特殊的意义外,这些特殊的意义也失去了$ ` \$ \’ \” \\
3 反斜杠 任何紧跟着反斜杠的字符都失去了它的特殊意义。
4 后引号 任何位于后引号之间的内容都将被视为命令并执行。
2、单引号考虑一个包含许多特殊shell字符的echo命令:
echo < -$100.**>; (update?) [y|n]

在每个特殊字符前加上反斜杠是一件很乏味的事情,而且会使一行很难读懂:
echo \< -\$100.\*\*\>\; \(update\?\) \[y\|n\]

有一个简单的方法可以引用大量的字符,在字符串的开头和结尾加一个单引号(‘ )
echo '< -$100.**>; (update?) [y|n]'

单引号内的字符被引用,就像每个字符前面有一个反斜杠一样。这样echo命令将以适当的方式显示。
如果输出的字符串中出现了一个单引号,那么不应该将整个字符串放在单引号中,而应该在前面使用反斜杠(\),如下的例子所示:
echo 'It\'s fun

3、双引号尝试执行以下shell脚本,这个shell脚本使用单引号:
VAR=ESPANA echo '$VAR < -$10.**>; [ (`date +%m/%d`) ]'

执行之后将收到以下结果
$VAR < -$10.**>; [ (`date +%m/%d`) ]

这不是必须展示的东西,很明显单引号防止变量替换。如果希望替换变量值并使单引号按预期工作,则需要将命令放在双引号中如下所示
VAR=ESPANA echo "$VAR < -$10.**>; [ (`date +%m/%d`) ]"

执行之后将收到以下结果:
ESPANA < -$10.**>; [ (11/02) ]

双引号去掉了除下列字符之外的所有字符的特殊含义:
(1)$用于参数替换
(2)命令替换的反引号
(3)\$启用文字美元符号
(4)启用文字反引号
(5)启用嵌入双引号
(6)启用嵌入的反斜杠
(7)所有其他\字符都是文字字符(不特殊)
单引号内的字符被引用,就像每个字符前面有一个反斜杠一样。这有助于echo命令正确显示。
如果输出的字符串中出现了一个单引号,那么不应该将整个字符串放在单引号中,而应该在前面使用反斜杠(\),如下所示:
echo 'It\'s fun'

4、反引号在反引号之间放置任何Shell命令都将执行该命令,下面是将任何Shell命令置于反引号之间的简单语法:
var=`command`

【Linux shell编程(shell引用机制解读和用法)】在下面的示例中执行date命令,生成的结果存储在DATA变量中。
DATE=`date`echo "当前日期: $DATE"

    推荐阅读