天天看點

《Linux C程式設計從入門到精通》——1.3 Shell的使用基礎

本節書摘來自異步社群《linux c程式設計從入門到精通》一書中的第1章,第1.3節,作者:宋磊 , 程鋼著,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

由于在c語言開發中常常需要和shell打交道,本小節将簡要介紹shell的基本使用方法,終端的運作界面可以參考圖1.5,以下僅僅給出在其中進行操作的相應字元串。

1.3.1 shell指令的标準格式

shell和使用者互動是以字元串形式存在的指令和指令輸出回報的方式進行的,在linux指令行中輸入的第一個字元串必須是一個指令的名字,第二個字元串是指令的選項或參數,指令行中的每個字元串必須由空格鍵或ta鍵隔開,格式如下。

<code>$ 指令 選項 參數</code>

或者

<code># 指令 選項 參數</code>

提示符“$”和“#”可區分使用者的不同權限,“$”表示普通使用者權限,而“#”代表的是root使用者(超級使用者)權限。選項是包括一個或多個字母的代碼,它前面有一個減号(減号是必要的,linux用它來差別選項和參數),選項可用于改變指令執行的動作的類型。

注意:在ubuntu作業系統中,使用者不能直接使用root權限,隻能通過sudo指令來暫時獲得root權限。

指令行實際上是一個可以編輯的文本緩沖區,在按Enter鍵之前,可以對輸入的文本進行編輯。例如,可以利用“backspace”鍵删除剛鍵入的字元,可以進行整行删除,還可以插入字元。使用者在輸入指令(尤其是複雜指令)時,若出現輸入錯誤,無須重新輸入整個指令,隻要利用編輯操作,即可改正錯誤。

利用向上的箭頭鍵可以重新顯示剛執行的指令,利用這一功能可以重複執行以前執行過的指令,而無須重新鍵入該指令。

一個标準的shell指令和指令的回報輸出如下(這是用ls指令檢視目前檔案夾下檔案清單的執行結果)。

1.3.2 shell的通配符

在shell中除使用普通字元外,還可以使用一些具有特殊含義和功能的字元,稱為通配符,在使用它們時應注意其特殊的含義和作用範圍。

shell的通配符主要用于模式比對,如檔案名比對、路徑名搜尋、字串查找等。常用的通配符有“*”、“?”和括在方括号“[ ]”中的字元序列等。使用者可以在作為指令參數的檔案名中包含這些通配符,構成一個所謂的“模式串”,以在執行過程中進行模式比對。這3個通配符的含義分别如下。

“”代表任意長度的字串。例如,“l”比對以l開頭的任意字串。但應注意,檔案名中的圓點(.)和路徑名中的斜線(/)必須是顯式的,即不能用通配符替代它們。例如,“”不能比對.c,而“.”才可以比對.c。

“?”代表任何單個字元。

“[ ]”指定了模式串比對的字元範圍,隻要檔案名中“[ ]”處的字元在指定的範圍之内,那麼這個檔案名就與該模式串比對。方括号中的字元範圍可以由字元串組成,也可以由表示限定範圍的起始字元、終止字元及中間連字元(-)組成。例如,f [a-d] 與f [abcd]的作用相同。

shell把與指令行中指定的模式串相比對的所有檔案名都作為指令的參數,形成最終的指令,然後再執行這個指令。如果目錄中沒有與指定的模式串相比對的檔案名,那麼shell将使用此模式串本身作為參數傳給指令(這正是指令中出現特殊字元的原因所在)。

表1.1列舉了這些通配符的具體執行個體及含義。

《Linux C程式設計從入門到精通》——1.3 Shell的使用基礎

需要注意的是,中間連字元(-)僅在方括号内有效,表示字元範圍。若在方括号外面,就成為普通字元了,而“”和“?”則隻在方括号外有效,若出現在方括号之内,它們也失去通配符的功能,成為普通字元了。例如,模式 l[?]abc中隻有一對方括号是通配符,而“”和“?”均為普通字元,是以,它比對的字串隻能是labc和l?abc。

【例1.1】是一個使用“*”通配符來讓“ls”指令隻顯示目前檔案夾中檔案名中帶“exam”,擴充名為“.c”的檔案的指令和對應輸出。

【例1.1】“*”通配符應用執行個體。

1.3.3 shell中的引号

在shell中可以使用的引号包括單引号、雙引号和反引号3種。

1.單引号

由單引号括起來的字元都作為普通字元使用。特殊字元用單引号括起來以後,也會失去原有意義,而隻作為普通字元解釋。例如,下面的一系列指令:

可見,單引号中的“$”保持了其本身的含義,作為普通字元出現,而在一般情形下,“$”符号的含義是引用變量的值,path本身是一個linux系統中的環境變量,其值是一系列的目錄,當使用者運作某個程式時,linux在這些目錄下進行搜尋。可以使用下面的指令檢視變量path的值。

<code>#echo $path</code>

2.雙引号

雙引号的作用與單引号類似,差別在于它沒有那麼嚴格。單引号告訴shell忽略所有的特殊字元,而雙引号隻要求忽略大多數特殊字元。具體來說,不會忽略括在雙引号中的3種特殊字元,即$、和` ,即雙引号會解釋字元串的特别意義,而單引号則直接使用字元串。如果使用雙引号将字元串賦給變量并回報它,實際上與直接回報變量并無差别。如果要查詢包含空格的字元串,經常會用到雙引号。

看看【例1.2】中的應用執行個體。

【例1.2】雙引号應用執行個體。

從【例1.2】中,可以清楚地看出無引号、單引号和雙引号之間的差別。

第一種情況,顯示變量x的值。由于x的值,即字元“*”比對了目前目錄(root目錄)下的所有檔案名,故顯示變量x的值時,會顯示目前目錄的所有檔案名。

第二種情況,使用了單引号。單引号中的字元保持其本身的含義,這種情況最簡單。

最後一種情況,使用了雙引号。雙引号告訴shell在引号内照樣進行變量名替換,是以shell把$x替換為,因為雙引号中不做檔案名替換(忽略掉了非特殊字元),是以就把“”作為要顯示的值傳遞給echo指令,作為echo指令的參數。

另外,從例子中還可以看到shell指派的先後次序:shell先進行變量替換,然後進行檔案名替換,最後把這些替換值作為參數傳遞給指令。

3.反引号

反引号“`”字元所對應的鍵一般位于鍵盤的左上角,不要将其同單引号“'”混淆。反引号括起來的字串被shell解釋為指令行。在執行時,shell首先執行該指令行,并以它的标準輸出結果取代整個反引号(包括兩個反引号)部分。例如:

shell執行echo指令時,首先執行pwd中的指令pwd,并使用輸出結果“/”取代pwd部分,最後輸出替換後的整個結果。

利用反引号的這種功能可以進行指令置換,即把反引号括起來的執行結果指派給指定變量。再例如:

另外,反引号還可以嵌套使用。但需要注意的是,嵌套使用時内層的反引号必須用反斜線()将其轉義。

1.3.4 shell中的注釋符

在shell程式設計或linux的配置文檔中,經常要對某些正文行進行注釋,以增加程式的可讀性。在shell中以字元 “# ”開頭的正文行表示注釋行。