命令中的特殊字符

一、字符串引用符双引号和单引号

1、双引号

双引号“”通常用来表示引用一个字符串,有时能屏蔽一些标点等特殊符号。在命令中使用双引号时,一般表示引用的部分是一个不可分割的整体。

通常可以理解为所有放入双引号中的内容都按照字符串来处理,除非有另一个引用号告知某个特殊字符串具有特殊含义(例如变量等)。

(1)屏蔽特殊字符

[root@localhost ~]# echo Tom Jim Kate Jack
Tom Jim Kate Jack

[root@localhost ~]# echo Tom Jim Kate Jack; Mary Roman
Tom Jim Kate Jack
bash: Mary: command not found

上面这个示例中包含了特殊字符“;”(分号表示一个命令的结束、另一个命令的开始),因此引起了系统的误解。像这种情况一般应该使用双引号表示字符串的引用:

[root@localhost ~]# echo "Tom Jim Kate Jack; Mary Roman"
Tom Jim Kate Jack; Mary Roman

(2)在双引号中使用其他引用符

如果在双引号引用的字符串中引用,应该使用其他引用符号。例如使用“$”引用变量:

[root@localhost ~]# NAME="Mary"
[root@localhost ~]# echo "Tom Jim Kate Jack; Mary Roman $NAME"
Tom Jim Kate Jack; Mary Roman Mary

除了变量引用符之外,还可以使用命令输出引用符反引号(倒引号):

[root@localhost ~]# echo "Now time:`date`"
Now time:Fri Dec  6 08:09:33 CST 2013

(3)在命令中使用双引号

在一些命令中还经常使用双引号避免shell误解选项的含义等。例如:

[root@localhost ~]# NAME="Tom Jim Kate Jack; Mary Roman Mary"
[root@localhost ~]# echo $NAME | grep Tom Jim
grep: Jim: No such file or directory
bash: echo: write error: Broken pipe
[root@localhost ~]# echo $NAME | grep "Tom Jim"
Tom Jim Kate Jack; Mary Roman Mary

2、单引号

单引号‘’的使用方法和作用与双引号基本上一致(但有区别,见3),都是将引号中的内容都当作字符串来处理。另外,单引号通常在一些特殊命令中与双引号配合,表示引用中的引用(shell中不允许一条命令中的两个引用号都使用双引号或单引号)。

(1)使用上面的示例:

[root@localhost ~]# echo $NAME | grep 'Tom Jim'
Tom Jim Kate Jack; Mary Roman Mary

(2)需要嵌套使用双引号时,但是shell不允许,此时使用的方法是:双引号内用单引号

[root@localhost ~]# awk 'BEGIN{system("date +'%Y%m%d-%T'")}'
20131206-08:26:05

3、双引号与单引号的区别

(1)双引号具有变量置换的功能,而单引号不具有变量置换的功能:

[root@localhost ~]# NAME="Tom"
[root@localhost ~]# echo "Your name is:$NAME"
Your name is:Tom
[root@localhost ~]# echo 'Your name is:$NAME'
Your name is:$NAME

(2)双引号具有命令置换的功能,而单引号不具有命令置换的功能:

[root@localhost ~]# echo 'Now time:`date`'
Now time:`date`
[root@localhost ~]# echo "Now time:`date`"
Now time:Fri Dec  6 08:48:58 CST 2013

总之,单引号内的内容会原原本本的保持(也可以说单引号可以屏蔽其内的所有特殊字符),而双引号内的内容会由于变量引用$或命令引用``而变化。

二、命令引用符反引号和命令转换符$()

反引号``有时也称为倒引号,这个键通常位于键盘的Tab键上方、数字键1的左边。反引号主要用来引用一些函数、命令输出等,执行时系统会尝试将反引号中的内容当作一个命令去执行。

提示:如果在一条命令中出现了命令引用符或命令转换符,系统会首先执行其内的命令。

(1)命令中的命令

[root@localhost ~]# ls -l `cat /etc/shells`
-rwxr-xr-x 1 root root  716972 Jul 12  2006 /bin/bash
lrwxrwxrwx 1 root root       4 Nov 12 23:57 /bin/csh -> tcsh
-rwxr-xr-x 1 root root 1169832 Jan 16  2007 /bin/ksh
lrwxrwxrwx 1 root root       4 Nov 12 23:52 /bin/sh -> bash
-rwxr-xr-x 1 root root  343756 Oct 31  2006 /bin/tcsh
-rwxr-xr-x 1 root root    3236 Jun 25  2007 /sbin/nologin
[root@localhost ~]# ls -l $(cat /etc/shells)
-rwxr-xr-x 1 root root  716972 Jul 12  2006 /bin/bash
lrwxrwxrwx 1 root root       4 Nov 12 23:57 /bin/csh -> tcsh
-rwxr-xr-x 1 root root 1169832 Jan 16  2007 /bin/ksh
lrwxrwxrwx 1 root root       4 Nov 12 23:52 /bin/sh -> bash
-rwxr-xr-x 1 root root  343756 Oct 31  2006 /bin/tcsh
-rwxr-xr-x 1 root root    3236 Jun 25  2007 /sbin/nologin

(2)在字符串中嵌套和使用一个命令的情况:

[root@localhost ~]# echo "Now time:`date +'%T'`"
Now time:08:35:44

[root@localhost ~]# echo "Now time:$(date +'%T')"
Now time:08:55:35

三、变量引用符美元符号$

[root@localhost ~]# date=`date`
[root@localhost ~]# echo "Host time is:$date"
Host time is:Fri Dec  6 09:03:15 CST 2013

四、反斜杠屏蔽符

许多时候需要在输出中使用这些特殊字符本身,这时应该使用反斜杠屏蔽其特殊的含义。

(1)例如要使用美元符号表示货币:

[root@localhost ~]# echo "Please pay \$15.50."
Please pay $15.50.

其实也可以使用单引号‘’实现上述目的:

[root@localhost ~]# echo 'Please pay $15.50.'
Please pay $15.50.

你要是在上面的$前加入反斜杠,连反斜杠的功能都被单引号‘’屏蔽掉了,反斜杠也会原原本本的输出:

[root@localhost ~]# echo 'Please pay \$15.50.'
Please pay \$15.50.
posted @ 2013-12-06 09:12  ITtecman  阅读(727)  评论(0编辑  收藏  举报