在本章中,我们将详细讨论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. | 报价&描述 |
---|---|
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`) ]"
执行后,您将收到以下结果 :
$VAR owes <-$1500.**>; [ as of (`date +%m/%d`) ]
双引号除去以下所有字符的特殊含义;
$ 参数替换
命令的反引号替换
\ $ 启用文字美元符号
\` 启用文字反引用
"启用嵌入式双引号
\\ 启用嵌入式反斜杠
所有其他 \ 字符都是文字(非特殊)
引用单引号中的字符就好像每个字符前面都有一个反斜杠.这有助于正确显示echo命令.
如果单个引号出现在要输出的字符串中,则不应将整个字符串放在单引号内相反,你应该先使用反斜杠(\),如下所示 :
echo 'It\'s Shell Programming'
在 backquotes 之间放置任何Shell命令都会执行命令.
这是简单的语法将任何Shell 命令放在反引号和减号之间;
var =`command`
date 命令在以下示例中执行,生成的结果存储在DATA变量中.
DATE=`date` echo "Current Date: $DATE"
执行后,您将收到以下结果 :
Current Date: Thu Jul 2 05:28:45 MST 2009