天天看点

老男孩教育每日一题-2017-04-14-说一下单引号、双引号和不加引号区别

单引号:

可以说是所见即所得:即将单引号内的内容原样输出,或者描述为单引号里面看到的是什么就会输出什么。

双引号:

特殊符号,有了原本的特殊意思,$LANG  $() ``

把双引号内的内容输出出来;如果内容中有命令、变量等,会先把变量、命令解析出结果,然后在输出最终内容来。

双引号内命令或变量的写法为 `命令或变量`或$(命令或变量)。

无引号:

    与双引号类似,支持通配符。

  把内容输出出来,可能不会将含有空格的字符串视为一个整体输出, 如果内容中有命令、变量等,会先把变量、命令解析出结果,然后在输出最终内容来,如果字符串中带有空格等特殊字符,则不能完整的输出,需要改加双引号,一般连续的字符串,数字,路径等可以用,不过最好用双引号替代之。

范例:

##单引号

<code>[root@oldboy32-vm1 ~]</code><code># echo '$LANG $PATH $(whichawk) {a..d}'</code>

<code>$LANG $PATH $(</code><code>which</code> <code>awk</code><code>) {a..d}</code>

##双引号

<code>[root@oldboy32-vm1 ~]</code><code># echo "$LANG $PATH$(which awk) {a..d}"</code>

<code>en_US.UTF-8</code><code>/usr/local/sbin</code><code>:</code><code>/usr/local/bin</code><code>:</code><code>/sbin</code><code>:</code><code>/bin</code><code>:</code><code>/usr/sbin</code><code>:</code><code>/usr/bin</code><code>:</code><code>/root/bin</code> <code>/bin/awk</code><code>{a..d}</code>

##不加引号

<code>[root@oldboy32-vm1 ~]</code><code># echo $LANG $PATH $(whichawk) {a..d}</code>

<code>en_US.UTF-8</code><code>/usr/local/sbin</code><code>:</code><code>/usr/local/bin</code><code>:</code><code>/sbin</code><code>:</code><code>/bin</code><code>:</code><code>/usr/sbin</code><code>:</code><code>/usr/bin</code><code>:</code><code>/root/bin</code> <code>/bin/awka</code> <code>b c d</code>

<code>[root@oldboy32-vm1 ~]</code><code># ls *.txt</code>

<code>a.txt cn.txt  oldboy_jia.txt  oldboy.txt oldgirl.txt  zh.txt</code>

<code>[root@oldboy32-vm1 ~]</code><code># ls "*.txt"</code>

<code>ls</code><code>: cannot access *.txt: No such </code><code>file</code> <code>or directory</code>

工作中多用双引号,除非你有明确的特殊的需求。

 实例1:经过反引号的`date`命令,命令行测试

<code>[root@Oldboyedu ~]$ </code><code>echo</code> <code>'`date`'</code>         <code>#### 单引号时看到啥就显示啥。</code>

<code>`</code><code>date</code><code>`</code>

<code>[root@Oldboyedu ~]$ </code><code>echo</code> <code>"`date`"</code>        <code>#### 双引号,如果里面是变量,会先把变量解析成具体内容再显示</code>

<code>Sun Mar 22 09:43:13 CST 2015</code>

<code>[root@Oldboyedu ~]$ </code><code>echo</code> <code>`</code><code>date</code><code>`         </code><code>#### 对于连续的字符串等内容一般不加引号也可,加双引号比较保险,推荐。</code>

<code>Sun Mar 22 09:43:19 CST 2015</code>

实例2:脚本中变量定义后,调试时测试

<code>[root@Oldboyedu ~]$ wxr=testchars           </code><code>###创建一个不带引号的变量</code>

<code>[root@Oldboyedu ~]$ </code><code>echo</code> <code>$wxr             </code><code>###不加引号,显示一个变量解析后的内容</code>

<code>testchars</code>

<code>[root@Oldboyedu ~]$ </code><code>echo</code> <code>'$wxr'</code>           <code>###单引号,显示一个变量本身</code>

<code>$root</code>

<code>[root@Oldboyedu ~]$ </code><code>echo</code> <code>"$wxr"</code>           <code>###双引号,一个变量内容,引号内可以是变量、字符串等</code>

实例3:脚本重定义变量测试

<code>[root@Oldboyedu ~]$ </code><code>echo</code> <code>$wxr</code>

<code> </code> 

<code>[root@Oldboyedu ~]$ wxr=this is testchars    </code><code>###不加引号无法定义。shell会把 is解释成命令。</code>

<code>-</code><code>bash</code><code>: is: </code><code>command</code> <code>not found</code>

<code>[root@Oldboyedu ~]$ wxr=</code><code>"this is testchars"</code>

<code>this is testchars</code>

结论:一般应用时,对于变量的定义,我们一般加双引号。

实例4:grep过滤字符串例子

<code>[root@Oldboyedu ~]$ </code><code>cat</code> <code>&gt;</code><code>grep</code><code>.log&lt;&lt;EOF</code>

<code>&gt; testchars</code>

<code>&gt; wxr</code>

<code>&gt; wxrlyy</code>

<code>&gt; EOF</code>

<code>[root@Oldboyedu ~]$ </code><code>cat</code> <code>grep</code><code>.log</code>

<code>wxr</code>

<code>wxrlyy</code>

<code>[root@Oldboyedu ~]$ wxr=testchars</code>

<code>[root@Oldboyedu ~]$ </code><code>grep</code> <code>"$wxr"</code> <code>grep</code><code>.log</code>

<code>[root@Oldboyedu ~]$ </code><code>grep</code> <code>'$wxr'</code> <code>grep</code><code>.log</code>

<code>[root@Oldboyedu ~]$ </code><code>grep</code> <code>$wxr </code><code>grep</code><code>.log</code>

实例5:grep过滤双引号(转义)例子

<code>[root@Oldboyedu ~]$ </code><code>cat</code> <code>&gt;wxr.log&lt;&lt;EOF</code>

<code>&gt; </code><code>"test"</code>

<code>&gt; </code><code>test</code>

<code>[root@Oldboyedu ~]$ </code><code>cat</code> <code>wxr.log</code>

<code>"test"</code>

<code>test</code>

<code>[root@Oldboyedu ~]$ </code><code>grep</code> <code>" wxr.log         </code><code>####直接按ctrl+d或ctrl+c 取消执行命令 </code>

<code>&gt; -</code><code>bash</code><code>: unexpected EOF </code><code>while</code> <code>looking </code><code>for</code> <code>matching `"'</code>

<code>-</code><code>bash</code><code>: syntax error: unexpected end of </code><code>file</code>

<code>[root@Oldboyedu ~]$ </code><code>grep</code> <code>" wxr.log</code>

<code>&gt; ^C                                               </code><code>#### è停在这里等待输入</code>

<code>[root@Oldboyedu ~]$ </code><code>grep</code> <code>\" wxr.log           </code>

实例6:特殊例子:命令行带空格字符串可以不加引号。可以不加引号的例子。

<code>[root@Oldboyedu ~]$ </code><code>echo</code> <code>I am wxr &gt;&gt;wxr.txt</code>

<code>[root@Oldboyedu ~]$ </code><code>cat</code> <code>wxr.txt</code>

<code>I am wxr</code>

<code>[root@Oldboyedu ~]$ </code><code>echo</code> <code>"I am wxr.test"</code> <code>&gt;&gt;wxr.txt</code>

<code>I am wxr.</code><code>test</code>

结论:虽然不加引号可以追加内容到oldboy.txt中,生产环境中,我们习惯用""双引号替代。

实例7:特殊例子:awk调用shell变量涉及引号例子

<code>[root@Oldboyedu ~]$ ett=123</code>

<code>[root@Oldboyedu ~]$ </code><code>awk</code> <code>'BEGIN {print '</code><code>$ett</code><code>'}'</code>

<code>123</code>

<code>[root@Oldboyedu ~]$ </code><code>awk</code> <code>'BEGIN {print "$ett"}'</code>

<code>$ett</code>

###提示:以上结果正好和前面的结论相反,这是awk调用shell变量的特殊用法。

<code>[root@Oldboyedu ~]$ ett=</code><code>'abc'</code>

<code>[root@Oldboyedu ~]$ </code><code>echo</code> <code>$ett</code>

<code>abc</code>

<code>[root@Oldboyedu ~]$ </code><code>awk</code> <code>'BEGIN {print "'</code><code>$ett</code><code>'"}'</code>

##提示:这个例子特殊了一点。有关awk调用shell变量参考:

一道实用linux运维问题大的9钟shell解答方法。

<a href="http://oldboy.blog.51cto.com/2561410/760192" target="_blank">http://oldboy.blog.51cto.com/2561410/760192</a>

很多时候,总结的结论未必适合所有情况。但是,总结小结论,便于我们学习知识和对知识的深刻理解,因此推荐大家多做总结。

不要太纠结于结论,结论毕竟不是真理,知识我们学习过程的产物。就像数学里的平行线一样,在初中定义就是不相交的两条直线就是平行线,到了高中这个结论就是错的了。

今天是老男孩教育每日一题陪伴大家的第28天。

往期题目索引

<a href="http://lidao.blog.51cto.com/3388056/1914205" target="_blank">http://lidao.blog.51cto.com/3388056/1914205</a>

本文转自 李导 51CTO博客,原文链接:http://blog.51cto.com/lidao/1916108