標籤:

20.4 Shell 字元串 (從新手到菜鳥的Linux教程)

原文鏈接 (在知乎編輯 Markdown 簡直就是災難QAQ)

好的,我抓緊把這個坑填上就可以安利其他有趣的命令了(

我們提到過 shell 是弱類型的語言,除了數字和數組類型以外好像也就字元串類型了。個人感覺用 shell 的時候字元串類型是最多的,因為你看傳參數是用字元串,就連循環

for i in `seq 1 10`ndon ...ndonen

i 的取值 seq 1 10 都是字元串類型。記得某篇文章說過 Lisp 系統比類 Unix 系統高端之處就在於前者用表傳參,而後者是用字元串傳參= =


shell 里寫字元串字面值有兩種方式:用單引號或雙引號包裹字面值。如:

$ echo Hello World!nHello World!n$ greetingString="Hello World!"n$ echo $greetingStringnHello World!n

在很多腳本語言里單引號和雙引號包裹是沒有區別的,但是在 shell 里確實是有區別的。

  • 單引號包裹的字面值不進行轉義,遇到第一個匹配的單引號停止包裹。如:

$ echo Broken pair of quote .n> ^Cn$ echo Broken pair of quote .n> ^Cn$ n

因此在向 curl 等命令傳 cookies 數據時,如果沒有需要替換的變數,單引號包裹是最好的。

思考題:如果想要輸出一個單引號應該怎麼辦呢?

  • 雙引號包裹的字面值進行變數替換、轉義字元替換、反引號替換和(很不常用的)歷史記錄替換
    • 變數替換比較好理解,就是 $val 或者 ${val} 會被其變數的值所替換,如:

$ echo "The string is $greetingString."nThe string is Hello World!.n$ echo "Or in another usage: ${greetingString}."nOr in another usage: Hello World!.n

這裡我們也注意到了雙引號包裹的字面值中單引號沒有特殊用途,而且不需要被 escape :

$ echo "The single quote looks like , but not ."nThe single quote looks like , but not .n

    • 轉義字元替換。文檔里寫了長長的一列,但我覺得經常用到的也就:

n換行 t製表符 轉義符本身 雙引號

個人習慣是琢磨一下哪裡輸出有問題就加一個試試看……

    • 反引號替換,就是獲得命令的結果然後插入到字元串末模板中,如:

$ echo "Time for now is `date`."nTime for now is Fri Jan 26 14:08:26 CST 2018.n


雙引號變數替換有另一些(八輩子都用不到)的語法我就不寫了= =

推薦閱讀:

有哪些 Bash 的替代語言?
linux運維學不懂,很絕望, 求正確方法?
如何評價 Windows 版「bash」(及其相關 *nix 子系統)?

TAG:Bash |