bash參考手冊之三(基本的Shell特性)續五

2021-08-27 09:21:00 字數 2376 閱讀 1702

3.5 shell擴充套件

在命令被分解後,擴充套件在命令列上執行。有執行7種型別的擴充套件要執行:

•大括號擴充套件

•波浪線擴充套件

•引數和變數擴充套件

•命令替換

•算術擴充套件

•單詞分割

•檔名擴充套件

•大括號擴充套件:擴充套件大括號內的表示式。

•波浪線擴充套件:擴充套件〜字元。

•shell引數擴充套件:

bash擴充套件變數為值的方法。

•命令替換:使用乙個命令的輸出作為引數。

•算術擴充套件:在shell擴充套件中如何使用算術計算。

•程序替換:從命令讀取和向命令

寫入的方法。

•單詞分割:把擴充套件的結果分割成單獨的引數。

•檔名擴充套件:指定檔名匹配模式的簡寫。

•引號移除:如何以及何時從單詞中移除引號字元。

擴充套件的順序是:大括號擴充套件,波浪線擴充套件,引數,變數和算術擴充套件和命令替換(由左到右的方式進行),單詞分割,檔名擴充套件。

有乙個額外的擴充套件——程序替換,在能夠支援它的系統上使用。它和引數,變數,和算術擴充套件和命令替換同時執行。

僅有大括號擴充套件,單詞分割,檔名擴充套件可以改變的擴充套件的單詞數目,其他擴充套件把乙個單一單詞擴充套件成乙個單一單詞。唯一的例外是「$ @」(見特殊引數)和「$ 」(請參閱陣列)的擴充套件。

引號擴充套件在所有擴充套件完成後執行(見引號移除)。

3.5.1 大括號擴充套件

大括號擴充套件是乙個產生任意字串的機制。這個機制和檔名擴充套件(見檔名擴充套件)相似,但生成的檔名必須不存在。被大括號擴充套件的模式一般是這種形式,乙個可選的preamble(序言),後跟位於一對大括號之間的一系列以逗號分隔的字串或乙個序列表達,後跟乙個可選的postscript(附言)。序言將被作為包含在大括號中的每個字串的字首,附言被附加到每個生成的字串後邊,擴充套件從左到右執行。

括號擴充套件可以巢狀。被擴充套件結果中的字串是沒有排序的,從左至右的順序被保留。例如,

bash$ echo ae

ade ace abe

序列表示式採取的形式,其中x和y是整數或單個的字元,incr是可選的增量,是乙個整數。當序列是整數時,該表示式擴充套件為x和y之間的數字,包括x和y。可以在整數前面加上'0',以強制每個段都具有相同的寬度。當x或y以零開頭時,shell試圖強制所有產生的字段包含相同的位數,必要填充時零。當序列是字串時,表示式擴充套件為x和y之間的字元,包括x和y。需要注意的是,x和y必須是相同型別。如果指定增量時,該增量被用於每個字段之間的差值。預設的增量根據情況是1或-1。

大括號擴充套件在任何其他擴充套件之前執行,在結果中保留對其他擴充套件具有特殊含義的字元。它是嚴格按照字面擴充套件的。 bash不對擴充套件內容或者大括號之間的文字進行任何句法翻譯。為了避免和引數擴充套件衝突,字串'$

或chown root /usr/,lib/}

3.5.2 波浪線擴充套件

如果乙個單詞以未被引號包含的波形符(「~」)開頭,那麼,從開始到第乙個沒有引號包含的斜槓(或所有字元,如果沒有引號包含的斜槓)被認為是乙個 tilde-prefix(波浪線字首)。如果波浪線字首中的字元沒有被引號包括,則波浪線字首中波浪線後的字元被視為乙個login name(登入名)。如果該登入名是空字串,波浪線被替換為shell變數home的值。如果home沒被設定,則它被替換為執行當前shell的使用者的主目錄。否則,波浪線字首將被指定的登入名的主目錄替換。

如果波浪線字首是'~+',shell變數pwd的值將取代波浪線字首。如果波浪線字首是' ~-',將被替換為shell變數oldpwd的值。

如果波浪線字首中的波浪號後面的字元組成乙個數字n,並由'+'或' - '字首,則波浪線字首被替換為目錄棧中的相應元素,如同使用內建命令dirs,並且命令引數就是上述波浪線字首中的波浪號後面的字元(見目錄堆疊)。如果波浪線字首,除了波浪線外,由乙個前邊沒有加上乙個'+'或' - '的數字組成的話,則假定是帶'+'的。

如果登入名是無效的,或波浪線擴充套件失敗,這個單詞保持不變。

任何後跟':'或'='的變數賦值,將檢查是否是不帶括號的波浪線擴充套件。在這些情況下,也進行波浪線擴充套件。因此,給path,mailpath,和cdpath賦值時,可以使用帶波浪線的檔名,shell會把擴充套件後的值賦給這些變數。

下表顯示了bash如何對待不帶括號的波浪線字首:

~$home的值

~/foo

$home/foo

~fred/foo

使用者fred的主目錄的foo子目錄

~+/foo

$pwd/foo

~-/foo

$/foo

~n將顯示乙個'dirs +n'命令的結果字串

~+n將顯示乙個'dirs +n'命令的結果字串

~-n將顯示乙個'dirs -n'命令的結果字串

bash參考手冊之三(基本的Shell特性)

3 基本的shell特性 bash是bourne again shell的縮寫。bourne shell是傳統的unix shell程式,最初是由史蒂芬 伯恩編寫的。所有bourne shell的內建命令在bash中都可用。評價和引用的規則是基於posix規範的 標準 的unix shell。本章簡...

bash參考手冊之三(基本的Shell特性)續四

3.3 shell函式 shell函式是使用乙個簡單的名字來執行一組命令的方式。就像乙個 普通 命令被執行似的。當乙個shell函式的名稱被用作乙個簡單的命令名稱時,和該函式名相關的命令列表就被執行。shell函式在當前shell上下文中執行,沒有建立新的程序。函式宣告使用的語法如下 name co...

Lua1 1 Lua 的參考手冊 (三)

出處 接上篇 7 一些例子 本段給出一些顯示 lua 特性的例子。它並不打算覆蓋完整的語言,只是顯示一有趣的使用。7.1 函式 next 和 nextvar 這個例子顯示如何使用函式 next 去遍歷乙個表的字段 function f t t is a table local i,v next t,...