天天看點

老男孩教育每日一題-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