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
是以下四种形式的引用:
Quoting | Description |
---|---|
单引号 | 所有在这些引号之间的特殊字符会失去它们特殊的意义 |
双引号 | 所有在这些引号之间的特殊字符会失去它们特殊的意义除了以下字符: - $ - ` - \$ - \' - \" -\\ |
反斜杠 | 任何直接跟在反斜杠后的字符会失去它们特殊的意义 |
反引号 | 所有在这些引号之间的特殊字符会被当做命令而被执行 |
考虑包含许多特殊的 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`
下面将执行 date 命令,产生的结果将被存储在 DATA 变量中。
DATE=`date`
echo "Current Date: $DATE"
这将输出以下结果:
Current Date: Thu Jul 2 05:28:45 MST 2009