命令中的特殊字符
一、字符串引用符双引号和单引号
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.