3 基本的shell特性
bash是bourne-again shell的縮寫。 bourne shell是傳統的unix shell程式,最初是由史蒂芬·伯恩編寫的。所有bourne shell的內建命令在bash中都可用。評價和引用的規則是基於posix規範的'標準'的unix shell。
本章簡要總結了shell的「積木」:命令,控制結構,shell函式,shell引數,shell擴充套件,重定向(這是一種導向輸入和輸出到命名檔案的方法),以及shell如何執行命令。
•shell語法:你輸入的命令shell能懂麼。
•shell命令:你可以使用的命令。
•shell函式:把命令組合起來。
•shell引數:shell如何儲存值。
•shell擴充套件:bash怎樣擴充套件引數和各種擴充套件方法。
•重定向:控制輸入和輸出的方法。
•執行命令:當你執行乙個命令時,會發生什麼。
•shell指令碼:執行shell命令的檔案。
3.1 shell語法
•shell操作:shell的基本操作。
•引號:如何去掉字元的特殊意義。
•注釋:如何指定注釋。
當shell讀取輸入時,它會進行一系列操作。如果輸入內容以注釋開始,shell忽略注釋符號(「#」),和該行的其餘部分。
否則,大致來說,shell讀取輸入,將輸入分為單詞和操作符,按照引號的規則來確定不同的單詞和字元的含義。
然後,shell把這些符號分解成命令和其他結構,去掉一些字元的特殊含義,擴充套件另外一些字元,按照需要重定向輸入和輸出,執行指定的命令,等待命令的退出狀態,並且使得這個退出狀態對進一步處理是可用的。
3.1.1 shell操作
以下是乙個對shell
讀取和執行命令進行的
簡要描述。基本上,shell執行以下操作:
1.讀取輸入內容,從乙個檔案(shell指令碼),從-c呼叫選項提供的字串(見呼叫bash),或從使用者的終端。
2.把輸入分成單詞和操作符,(根據引用規則)。這些字元通過分隔符分隔的。這一步也執行了別名的擴充套件(見別名)。
3.解析字元為簡單和復合命令(見shell命令)。
4.執行不同的shell擴充套件(見shell擴充套件),把擴充套件結果分解為檔名列表(見檔名擴充套件),命令和引數。
5.執行所有必要的重定向(見重定向),從引數列表中移除重定向操作符和它們的運算元。
6.執行命令(見執行命令)。
7.根據情況可以選擇等待命令完成並收集它的退出狀態(見退出狀態)。
3.1.2 引用
•轉義字元:如何去除乙個單個字元的特殊意義。
•單引號:如何抑制shell對一組字串行的解釋操作。
•雙引號:如何抑制shell對一組的字串行的大多數的解釋操作。
•ansi-c引用:如何在帶引號的字串中擴充套件ansi-c序列。
•區域翻譯:如何翻譯成不同語言的字串。
引用是用來去除某些字元或單詞在shell中的特殊意義。引號可以用於禁用對特殊字元的特殊處理,以防止被識別出來的保留字被特殊處理,以及防止引數擴充套件。
每個shell分隔符(見定義)對shell都具有特殊的意義,如果它僅僅是代表字元本身,則必須被引號包含。如果正在使用命令歷史擴充套件(見history互動),歷史擴充套件字元,通常是'!',必須用引號包含以防止歷史的擴充套件。關於歷史擴充套件的詳細資訊,請參閱bash的歷史實用工具。
bash有三個引用機制:轉義字元,單引號和雙引號。
3.1.2.1 轉義字元
不帶引號的反斜槓「\」是的bash轉義字元。它保留了除換行外的下乙個字元的字面含義。如果\換行成對出現,反斜線本身中沒有引號,\換行被視為續行(也就是說,它將被從輸入流中刪除,並有效地忽略)。
3.1.2.2 單引號
將字元包含在單引號(''')中,能夠保留引號內的每個字元的字面含義。乙個單引號不應出現在兩個單引號之間,即使前面有乙個反斜槓。
3.1.2.3 雙引號
將字元放在雙引號(「」)中,能夠保留在引號內的所有字元的文字值,但是除了'$','`','\',以及歷史擴充套件被啟用時的'!'。字元'$'和'`'雙引號內保留其特殊的含義(請參閱shell擴充套件)。反斜槓保留它特殊的意義的情況是,只有當後接以下字元:'$','`','「','\',或換行時。在雙引號裡,反斜槓後面跟著這些字元之一時,反斜
槓本身將被移除。反斜槓前導沒有特殊含義的字元時,保持不變。雙引號中可以包含雙引號,要在被包含的雙引號前面加上乙個反斜槓。如果歷史擴充套件被啟用,歷史擴充套件將被進行,除非出現在雙引號中的'!'使用反斜槓轉義。反斜槓前的'!'不會被刪除。
特殊引數'*','@'在雙引號中有特殊的含義(見擴充套件shell引數)。
3.1.2.4 ansi-c引用
$「string'形式的單詞被特殊處理。這個詞擴充套件為字串,同時以反斜槓轉義字元替換為指定的ansi c標準內容。反斜槓轉義序列,如果出現的話,則進行解碼,如下所示:
\a警報(響鈴)
\ b退格鍵\e
\ e乙個轉義字元(ansi c)
\f跳頁
\n換行
\r回車
\t水平製表符
\v垂直製表符
\\乙個反斜槓
\'單引號
\"雙引號
\nnn
8位字元,它的值是八進位制值nnn(一到三個數字)
\xhh
8位字元,它的值是十六進製制值hh(乙個或兩個十六進製制數字)
\uhhhh
(iso/ iec 10646)的unicode字元,它的值是十六進製制值hhhh(一至四個十六進製制數字)
\uhhhhhhhh
(iso/ iec 10646)的unicode字元的值是十六進製制值hhhhhhhh的(8個十六進製制數字)
\cxcontrol-x字元
擴充套件的結果是單引號包含,就像沒有$符號一樣。
3.1.2.5 特定區域的翻譯
雙引號的字串前面加上乙個美元符號($)將導致根據當前的區域設定轉換字串。如果目前的語言環境是c或posix,美元符號將被忽略。如果該字串被翻譯和替換了,那麼結果仍然有雙引號。
有些系統使用由lc_messages shell變數確定的訊息分類。其他從textdomain shell變數的值建立訊息分類的名稱,可能新增字尾「.mo」。如果您使用變數的textdomain,您可能需要設定textdomaindir變數。還有一些人用這種方式:
textdomaindir
/lc_messages
/lc_messages/textdomain
.mo.
在乙個非互動的shell,或互動式shell中,內建命令shopt 的interactive_comments選項啟用(見內建命令shopt)的情況下,「#」開頭的單詞,使這個單詞以及該單詞之後的該行所有剩餘的字元被忽略。互動的shell沒有啟用interactive_comments選項時,不允許注釋。 在互動式shell中,interactive_comments選項是預設啟用的(見互動shell)。
bash參考手冊之三(基本的Shell特性)續四
3.3 shell函式 shell函式是使用乙個簡單的名字來執行一組命令的方式。就像乙個 普通 命令被執行似的。當乙個shell函式的名稱被用作乙個簡單的命令名稱時,和該函式名相關的命令列表就被執行。shell函式在當前shell上下文中執行,沒有建立新的程序。函式宣告使用的語法如下 name co...
bash參考手冊之三(基本的Shell特性)續五
3.5 shell擴充套件 在命令被分解後,擴充套件在命令列上執行。有執行7種型別的擴充套件要執行 大括號擴充套件 波浪線擴充套件 引數和變數擴充套件 命令替換 算術擴充套件 單詞分割 檔名擴充套件 大括號擴充套件 擴充套件大括號內的表示式。波浪線擴充套件 擴充套件 字元。shell引數擴充套件 b...
Lua1 1 Lua 的參考手冊 (三)
出處 接上篇 7 一些例子 本段給出一些顯示 lua 特性的例子。它並不打算覆蓋完整的語言,只是顯示一有趣的使用。7.1 函式 next 和 nextvar 這個例子顯示如何使用函式 next 去遍歷乙個表的字段 function f t t is a table local i,v next t,...