bash中单引号和bash 双引号号的区别

linux shell中的单引号与双引号的区别(看完就不会有引号的疑问了)
我的图书馆
linux shell中的单引号与双引号的区别(看完就不会有引号的疑问了)
" "(双引号)与 ' '(单引号)的区别   你在shell prompt(shell 提示)后面敲打键盘、直到按下enter的时候,你输入的文字就是command line(命令行)了,然后shell才会以进程方式执行你所提交的命令。但是,你又可知道:你在command line输入的每一个文字,对shell来说,有什么类别之分呢?简单而言,command line的每一个charactor(字符)分为如下两种: & *literal(文字):也就是普通纯文字,对shell来说没有特殊功能。 & *meta(元字符):对shell来说,具有特定功能的保留字。literal没有什么好说的,凡是 abcd、123456 等这些“文字”都是literal。但是meta却常使我们困惑。事实上,前两章我们在command line中已碰到两个几乎每次都会碰到的meta: & &*IFS(交换字段分隔符):由&space& &tab& &enter&三者之一组成(我们常用space)。 & &*CR(回车键):由&enter&产生。IFS是用来拆分command line的每一个词(word)用的,因为shell command line是按词来处理的。而CR则是用来结束command line用的,这也是为何我们敲&enter&命令就会执行的原因。除了IFS和CR外,常用的meta还有:= : &设定变量。$ : &做变量或运算替换(请不要与 shell prompt 搞混了)。& : &重定向 stdout(标准输出standard out)。& : &重定向 stdin(标准输入standard in)。|: & 管道命令。& : &重定向 file descriptor (文件描述符),或将命令置于后台执行。( ): 將其內的命令置于 nested subshell (嵌套的子shell)执行,或用于运算或命令替换。{ }: 將其內的命令置于 non-named function(未命名函数) 中执行,或用在变量替换的界定范围。; : &在前一个命令结束时,而忽略其返回值,继续执行下一個命令。&& : 在前一個命令结束时,若返回值为 true,继续执行下一個命令。|| : 在前一個命令结束时,若返回值为 false,继续执行下一個命令。!: & 执行 history 列表中的命令....假如我们要在command line中将这些保留元字符的功能关闭的话,就要用到 quoting (引用)处理了。在bash中,我们常用的 quoting有如下三种方法: & &*hard quote:''(单引号),凡在hard quote中的所有meta均被关闭。 & &*soft quote:""(双引号),在soft quote中的大部分meta都会被关闭,但某些保留(如$)。 & &*escape:\ (反斜线),只有紧接在escape(跳脱字符)之后的单一meta才被关闭。下面的例子將有助于我们对 quoting 的了解: & & & &$ A=B C & & & &# 空白键未被关闭,作为IFS 处理。 & & & &$ C: command not found.
& & & &$ echo $A & & & &$ A="B C" & & & &# 空白键已被关闭,仅作空白符号处理。 & & & &$ echo $A & & & &B C在第一次设定 A 变量时,由于空白键没有被关闭,command line 将被解读为:* A=B 然后碰到&IFS&,再执行 C 命令在第二次设定 A 变量时,由于空白键置于 soft quote 中,因此被关闭,不再作为 IFS :* A=B&space&C事实上,空白键无论在 soft quote 还是在 hard quote 中,均会被关闭。Enter 鍵亦然: & & & &$ A='B & & & && C & & & && ' & & & &$ echo "$A" & & & &B & & & &C在上例中,由于 &enter& 被置于 hard quote 当中,因此不再作为 CR 字符來处理。这里的 &enter& 单纯只是一个断行符号(new-line)而已,由于 command line 并沒得到 CR 字符,因此进入第二個 shell prompt (PS2,以 & 符号表示),command line 并不会结束,直到第三行,我们输入的 &enter& 并不在 &hard quote 里面,因此并沒被关闭,此时,command line 碰到 CR 字符,于是结束、交给 shell 來处理。上例的 &enter& 要是被置于 soft quote 中的话, CR 也会同样被关闭: & & & &$ A="B & & & && C & & & && " & & & &$ echo $A & & & &B C然而,由于 echo $A 时的变量沒置于 soft quote 中,因此当变量替换完成后并作命令行重组时,&enter& 会被解释为 IFS ,而不是解释为 New Line 字符。同样的,用 escape 亦可关闭 CR 字符: & & & &$ A=B\ & & & && C\ & & & && & & & &$ echo $A & & & &BC上例中,第一个 &enter& 跟第二个 &enter& 均被 escape 字符关闭了,因此也不作为 CR 來处理,但第三个 &enter& 由于没有被跳脱,因此作为 CR 结束 command line 。但由于 &enter& 鍵本身在 shell meta 中的特殊性,在 \ 跳脱后面,仅仅取消其 CR 功能,而不会保留其 IFS 功能。您或许发现光是一个 &enter& 鍵所产生的字符就有可能是如下这些可能:CRIFSNL(New Line)FF(Form Feed)NULL...至于 soft quote 跟 hard quote 的不同,主要是对于某些 meta 的关闭与否,以 $ 來作说明: & & & &$ A=B\ C & & & &$ echo "$A" & & & &B C & & & &$ echo '$A' & & & &$A在第一个 echo 命令行中,$ 被置于 soft quote 中,將不被关闭,因此继续处理变量替换,因此 echo 將 A 的变量值输出到屏幕,也就得到 &"B C" 的结果。在第二个 echo 命令行中,$ 被置于 hard quote 中,则被关闭,因此 $ 只是一个 $ 符号,并不会用來作变量替换处理,因此结果是 $ 符号后面接一个 A 字母:$A 。---------------------------------------------------------练习与思考:以下两条命令输出的结果分别是什么? & & & &$ A=B\ C & & & &$ echo '"$A"' & & & &# 最外面的是单引号 & & & &$ echo "'$A'" & & & &# 最外面的是双引号----------------------------------------------------------------【认真阅读文章,答案自会揭晓】-------------------------------------------------------下面为扩展阅读,难度有点大,初级同学建议学懂上面的就好。以后再做拓展也可以。*************************************************************************************** & & & & & & & & & & & & & & & & & & & & & & & & & & & & & 在 CU 的 shell 版里,我发现有很多初学者的问题,都与 quoting 理解的有关。比方说,若我们在 awk 或 sed 的命令参数中调用之前设定的一些变量时,常会问及为何不能的问题。要解决这些问题,关键点就是:* 区分出 shell meta 与 command meta 前面我们提到的那些 meta ,都是在 command line 中有特殊用途的,比方说 { } 是將其內一系列 command line 置于不具名的程序中执行(可简单视为 command block ),但是,awk 却需要用 { } 來区分出 awk 的命令区段(BEGIN, MAIN, END)。若你在 command line 中如此输入:123[root@jasontest01 ~]# awk {print $0} 1.txt&& #这里$0由shell解释awk: cmd. line:1: {printawk: cmd. line:1:&&&&&& ^ unexpected newline or end of string由于 &{ } 在 shell 中并没关闭,那 shell 就將 {print $0} 视为 command block ,但同时又沒有" ; "符号作命令区隔,因此就出现 awk 的语法错误結果。要解決之,可用 hard quote :123456[root@jasontest01 ~]# awk '{print $0}' 1.txt&&& #而这里因为有''作用,所以$0其实是由awk程序解释i am studentmy teacher is oldboyi am very happyi come from guangzhounow i am in beijing上面的 hard quote 应好理解,就是將原本的 {、&space&、$(注三)、} 这几个 shell meta 关闭,避免掉在 shell 中遭到处理,而完整的成为 awk 参数中的 command meta 。( 注三:而其中的 $0 是 awk 內建的 field number ,而非 &awk 的变量,awk 自身的变量无需使用 $ 。)要是理解了 hard quote 的功能,再來理解 soft quote 与 escape 就不难:123456[root@jasontest01 ~]# awk "{print \$0}" 1.txti am studentmy teacher is oldboyi am very happyi come from guangzhounow i am in beijing123456[root@jasontest01 ~]# awk \{print\ \$0\} 1.txti am studentmy teacher is oldboyi am very happyi come from guangzhounow i am in beijing然而,若你要改变 awk 的 $0 的 0 值是从另一个 shell 变量读进呢?比方说:已有变量 $A 的值是 0 ,那如何在 command line 中解決 awk 的 $$A 呢?你可以很直接否定掉 hard quoe 的方案:$ awk '{print $$A}' 1.txt那是因为 $A 的 $ 在 hard quote 中是不能替换变量的。聪明的读者(如你!),经过以上学习,我想,应该可以解释为何我们可以使用如下操作了吧:A=0awk "{print \$$A}" 1.txtawk \{print\ \$$A\} 1.txtawk '{print $'$A'}' 1.txt & & & #此处注意'的结合方式,前面的''结合,后面的‘’结合,下同awk '{print $'"$A"'}' 1.txt & & # 注:"$A" 包在 soft quote 中,,此处也要注意''与""的结合单引号和双引号都能关闭shell对特殊字符的处理。不同的是,双引号没有单引号严格,单引号关闭所有有特殊作用的字符,而双引号只要求shell忽略大多数,具体的说,就是①美元符号②反引号③反斜杠,这3种特殊字符不被忽略。 不忽略美元符号意味着shell在双引号内部也进行变量名替换。下面用一个简单的shell程序要说明一下。12345678910111213debian:~/learn/shell# cat phonebookAlice Chebba 973-555-2015Barbara Swingle 201-555-9257Liz Stachiw 212-555-2298Susan Goldberg 201-555-7776Susan Topple 212-555-4932Tony Iannino 973-555-1295Stromboli Pizza 973-555-9478debian:~/learn/shell#debian:~/learn/shell# cat lu# Look someone up in the phone bookgrep "$1" phonebookdebian:~/learn/shell#这是正确的lu程序,下面是运行结果。12345debian:~/learn/shell# ./lu 'Susan T'Susan Topple 212-555-4932debian:~/learn/shell# ./lu TonyTony Iannino 973-555-1295debian:~/learn/shell#如果lu写成①grep $1 phonebook或者②grep '$1' phonebook,就会出现下面的错误结果(为什么?)。①的结果:1234567debian:~/learn/shell# ./lu Tony //这种情况结果正确Tony Iannino 973-555-1295debian:~/learn/shell# ./lu 'Susan T' //这种情况结果错误grep: T: No such file or directoryphonebook:Susan Goldberg 201-555-7776phonebook:Susan Topple 212-555-4932debian:~/learn/shell#②的结果:123debian:~/learn/shell# ./lu Tony //这种情况结果错误debian:~/learn/shell# ./lu 'Susan T' //这种情况结果也错误debian:~/learn/shell#————————————————————————————————输出结果:(思考,为什么不同?)$ A=B\ C$ echo '"$A"' & & & &# 最外面的是单引号"$A"$ echo "'$A'" & & & &# 最外面的是双引号'B C'
发表评论:
TA的最新馆藏[转]&shell(5)
Linux Shell 中的反引号,单引号,双引号&&
&&&&&& 如下,shell会执行反引号中的date命令,把结果插入到echo命令显示的内容中。
  [root@localhost sh]# echo The date is `date`
  The date is 2011年 03月 14日 星期一 21:15:43 CST
  单引号、双引号用于用户把带有空格的字符串赋值给变量事的分界符。
  [root@localhost sh]# str=&Today is Monday&
  [root@localhost sh]# echo $str
  Today is Monday
  如果没有单引号或双引号,shell会把空格后的字符串解释为命令。
  [root@localhost sh]# str=Today is Monday
  bash: is: command not found
  单引号和双引号的区别。单引号告诉shell忽略所有特殊字符,而双引号忽略大多数,但不包括$、\、`。
  [root@localhost sh]# testvalue=100
  [root@localhost sh]# echo 'The testvalue is $testvalue'
  The testvalue is $testvalue
  [root@localhost sh]# echo &The testvalue is $testvalue&
  The testvalue is 100
&&& 下面举几个例子:
可见,单引号中完全是保持字符串的原型输出,而双引号进行了命令替换。
&&& 由上可见虽然单引号和双引号都是字符串的限定符,但还是有所区别。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:20302次
排名:千里之外
原创:47篇
转载:29篇
(6)(3)(6)(3)(3)(2)(5)(1)(4)(5)(15)(18)(6)博客访问: 1037461
博文数量: 274
博客积分: 3713
博客等级: 少校
技术积分: 2203
注册时间:
http://blog.chinaunix.net/uid/.html
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: LINUX
一、单引号和双引号
首先,单引号和双引号,都是为了解决中间有空格的问题。
因为空格在linux中时作为一个很典型的分隔符,比如string1=this is astring,这样执行就会报错。为了避免这个问题,因此就产生了单引号和双引号。他们的区别在于,单引号将剥夺其中的所有字符的特殊含义,而双引号中的'$'(参数替换)和'`'(命令替换)是例外。所以,两者基本上没有什么区别,除非在内容中遇到了参数替换符$和命令替换符`。
所以下面的结果:
echo ‘$num’
echo “$num”
所以,如果需要在双引号””里面使用这两种符号,需要用反斜杠转义。
二、反引号``
这个东西的用法,我百度了一下,和$()是一样的。在执行一条命令时,会先将其中的 ``,或者是$() 中的语句当作命令执行一遍,再将结果加入到原命令中重新执行,例如:
会先执行 ls 得到xx.sh等,再替换原命令为:
echo xx.sh
最后执行结果为
那么,平时我们遇到的把一堆命令的执行结果输出到一个变量中,需要用这个命令替换符括起来,也就可以理解了。
这里又涉及到了一个问题,虽然不少系统工程师在使用替换功能时,喜欢使用反引号将命令括起来。但是根据POSIX规范,要求系统工程师采用的是$(命令)的形式。所以,我们最好还是遵循这个规范,少用``,多用$()
三、小括号,中括号,和大括号的区别
那么,下面又涉及到了一个问题,就是小括号,中括号,和大括号的区别。
先说说小括号和大括号的区别。这两者,实际上是“命令群组”的概念,也就是commandgroup。
( ) 把 command group 放在subshell去执行,也叫做 nested sub-shell。
{ } 则是在同一个 shell 內完成,也称为 non-namedcommand group。
所以说,如果在shell里面执行“函数”,需要用到{},实际上也就是一个命令群组么。
不过,根据实测,test=$(ls -a)可以执行,但是test=${ls–a}语法上面是有错误的。估计也和上面所说的原因有关。
另外,从网上摘录的区别如下:
A,()只是对一串命令重新开一个子shell进行执行
B,{}对一串命令在当前shell执行
C,()和{}都是把一串的命令放在括号里面,并且命令之间用;号隔开
D,()最后一个命令可以不用分号
E,{}最后一个命令要用分号
F,{}的第一个命令和左括号之间必须要有一个空格
G,()里的各命令不必和括号有空格
H,()和{}中括号里面的某个命令的重定向只影响该命令,但括号外的重定向则影响到括号里的所有命令
两个括号(()),是代表算数扩展,就是对其包括的东西进行标准的算数计算——注意,不能算浮点数,如果需要算浮点数,需要用bc做。
至于中括号[],感觉作用就是用来比较的。比如放在if语句里面,while语句里面,等等。
这里引出来[..]和[[…]]的区别:(摘自网上,实测证实):使用[[... ]]条件判断结构, 而不是[ ... ], 能够防止脚本中的许多逻辑错误.比如,&&, ||,
操作符能够正常存在于[[ ]]条件判断结构中, 但是如果出现在[ ]结构中的话,会报错。
阅读(1008) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。Linux命令中引号那点事
我们将把编写脚本的事情暂时搁在一边,然后来讨论一些,我们一直在用的,但是没有解释的东西。&引号在这一节里面,我们会讲述引号。引号有两个作用:
控制字符替换&和
执行将单词包含在一起的功能
我们已经使用过引号。&在我们的脚本里面,将文本信息赋值给常量的赋值操作就使用了引号:
在上面这个例子中,文本信息是被双引号包括住的。我们使用双引号的原因是---我们要把所有单词包括住,当作一个整体来对待。如果我们没有使用引号,那么bash解释器,就会将所有位于第一个单词后面的单词,解释为其他的命令(第一个单词被解释为命令)。
尝试一下运行下面的命令,看看有什么效果出来:
单引号和双引号&
shell解释器可以识别双引号和单引号。&下面的复制表达式效果是等价的:
然而,在双引号和单引号之间存在一个重要的差别。&单引号,在字符替换方面有限制。&正如我们在上一节所看到的内容一样,你可以将一个变量放在双引号里面,而shell解释器依然会对变量执行字符替换的操作。&
&我们可以通过使用echo命令来查看这种效果:&
如果我们将上述的双引号改为单引号,那么,行为将会改变:
双引号并没有限制---以"$"开头的变量的字符替换,不过,它的确对通配符的扩展效果进行了限制。比如,下面这个例子:
引用单个字符&
还有另外一种引用字符你会碰到的。&它就是反斜杠。The
tells&反斜杠告诉shell解释器忽略反斜杠符后面的第一个字符。比如:
通过使用反斜杠符,shell解释器忽略了对"$"符号进行解释。既然shell已经忽略了"$",那么,shell解释器也就不会对$HOSTNAME执行字符替换了。&下面,给出一个更有用例子:
正如你所看到的,通过使用反斜杠符号,我们可以将双引号包含在文本里面。
反斜杠的其他使用技巧
如果,你阅读过任何软件的使用手册,并且这手册是由GNU项目完成的,那么,你会发现,在软件的命令选项中,除了以一个下划线_加一个字母的形式出现之外,还有,以两个下划线加一个完整的单词的形式出现。例如,下面两个语句是等价的:
为什么在软件中,这两种形式都是支持的呢?短的那种形式,是专门为那些懒的输入员而设定的,而长的那种形式,是专门为写脚本而存在的。我有时候,是混合着使用上面的两种形式,然后,我发现采用长的命令选项有用,如果,我写了一个脚本,并且,我将在几个月后去阅读它。看到长的命令选项,有助于我理解这个命令选项是什么意思,从而省却我去查man手册的功夫。现在多敲几下键盘,会以后节省很多功夫。&这样,懒惰的原则就保持住了。
你有可能会疑虑,使用长的命令形式,会导致一个单独的命令变得很长。&为了与这个问题斗争,你可以使用反斜杠来让shell解释器忽略换行符号,正如下面的操作:
这样使用反斜杠,可以让我们将每行的内容包含在一个单独的命令中。让这个技巧可以应用,要注意的地方:换行,必须在反斜杠后面马上出现(也就是,在输入了反斜杠之后,就必须换行了)。&如果,你将一个空格符放置在反斜杠后面,那么,空格符号会被忽略,而不是换行符被忽略。反斜杠符,也可以被用于,将特殊的符号插入到文本。special
characters into our
text.&这些符号,被叫做---转移字符,下面就有一些转移字符:
..................................................
.................................................
可能的用途
添加空白行在文本中
将水平制表符添加到文本中
让你的终端发出嘟嘟声。
插入一个反斜杠符
Sending this to your printer ejects
转移字符的应用很常见。非常常见转移字符,这个想法,首先出现在C语言里面。编程语言今天,shell解释程序,C++,perl,python,awk,tcl和其他程序语言都使用了转移字符这个概念。通过使用echo命令的-e选项,我们将展示上述转移字符的应用:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。}

我要回帖

更多关于 bash 单引号 双引号 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信