Shell的預處理
當我們在shell中敲擊命令按下enter鍵時,其實bash在這些命令字符送到命令前做了一些處理,這些處理叫expansion,比如“*”字符在shell命令行中有很多意義。在命令行enter后,這些特殊字符將會擴展成另外的一些東西。
echo是shell內建的程序,打印出該命令的參數(shù)到stdout。但是如果是echo *,命令將不是打印出*而是另外一些東西。shell在echo命令執(zhí)行之前將*擴展成了另外的東西。
-
通配符“*”的工作機制被稱為pathname expansion。
通配符* - “”在單詞前擴展為該單詞名稱的家目錄,如syl。
~家目錄 - “$”是算術擴展。echo $((expression)),可以嵌套。echo $((2 + 2));echo $(($((5**2)) * 3))。
$算術擴展 -
{}花括號擴展??梢愿鶕?jù)花括號中的模型pattern創(chuàng)建多個text字符串
花括號擴展 -
參數(shù)擴展parameter expansion。在系統(tǒng)中存儲著一些有名字的數(shù)據(jù)集,實際上這些數(shù)據(jù)集叫做變量。echo $USER顯示USER變量的內容。想要知道可用的變量列表可以printenv | less。
變量擴展 -
命令替換??梢宰屛覀兪褂靡粋€命令的輸出作為另一個命令的參數(shù)。
命令替換
引號的使用

出現(xiàn)問題
- 忽略了參數(shù)中多余的空格
- 由于$1是一個沒有定義的變量所以為空字符
引號的出現(xiàn)解決這些問題。
雙引號
將字符放在雙引號內,shell中那些擁有特有含義的字符就失去了這些特殊含義,只是普通的字符文本,但是其中“$”“\”“`”三個例外。

出現(xiàn)問題
ls命令會認為這是兩個參數(shù)。用ls -l "two words.txt"就可以去除空格的影響,修復mv "two words.txt" two_words.txt。然而$依然可用,echo "$USER $((2 + 2)) $(cal)"。

$依然可用
通常,單詞分割是根據(jù)空格space,制表符tab,換行newlines這些單詞間的分隔符。這就是說,沒有在引號內的spaces,tabs,newlines并不是文本的一部分,他們只是分隔符,因此就變成了多個命令參數(shù)。加上雙引號就取消了這些分隔符的意義,變成一個參數(shù)。

分隔符
單引號
為了消除所有的expansion,使用單引號

單引號
轉義字符
通常在雙引號中出現(xiàn)的消除特殊含義的擴展。





