轉載於網絡,稍加整理。linux
咱們知道計算機的運做不能離開硬件,但使用者卻沒法直接對硬件做驅動,硬件的驅動只能透過一個稱爲"操做系統(Operating System)"的軟件來控管,事實上, 咱們天天所談的linux , 嚴格來講只是一個操做系統, 咱們稱之爲"核心(kernel)"。然而,從使用者的角度來講,使用者也沒辦法直接操做 kernel ,而是透過 kernel 的"外殼"程序,也就是所謂的 shell ,來與 kernel 溝通。這也正是 kernel 跟 shell 的形像命名關係。shell
從技術角度來講, shell 是一個使用者與系統的互動界面(interface),主要是讓使用者透過命令行(command line)來使用系統以完成工做。所以, shell 的最簡單的定義就是---命令解譯器(Command Interpreter):bash
每次當咱們完成系統登入(log in), 咱們就取得一個互動模式的 shell , 也稱爲 login shell或 primary shell。
若從進程(process)角度來講,咱們在 shell 所下達的命令,均是 shell 所產生的子進程。這現像,咱們暫可稱之爲 fork 。
若是是執行腳本(shell script)的話,腳本中的命令則是由另一個非互動模式的子 shell(sub shell)來執行的。
也就是 primary shell 產生 sub shell 的進程, sub shell 再產生 script 中全部命令的進程。網絡
當你成功登陸進一個文字界面以後,大部份情形下,你會在熒幕上看到一個不斷閃爍的方塊或底線(視不一樣版本而別),咱們稱之爲遊標(coursor)。
遊標的做用就是告訴你接下來你從鍵盤輸入的按鍵所插入的位置,且每輸如一鍵遊標便向右邊移動一個格子,若連續輸入太多的話,則自動接在下一行輸入。
假如你剛完成登陸還沒輸入任何按鍵以前,你所看到的遊標所在位置的同一行的左邊部份,咱們稱之爲提示符號(prompt)。
提示符號的格式或因不一樣系統版本而各有不一樣,在 Linux 上,只需留意最接近遊標的一個可見的提示符號,一般是以下二者之一:
$:給通常使用者賬號使用
#:給 root (管理員)賬號使用學習
事實上, shell prompt 的意思很簡單:ui
咱們能夠說,使用者只有在獲得 shell prompt 才能打命令行,而 cursor 是指示鍵盤在命令行所輸入的位置,使用者每輸入一個鍵, cursor 就日後移動一格,直到碰到命令行讀進 CR(Carriage Return,由 Enter 鍵產生)字符爲止。
CR 的意思也很簡單:編碼
嚴格來講,所謂的命令行,就是在 shell prompt 與 CR 字符之間所輸入的文字。spa
系統可接受的命令名稱(command-name)能夠從以下途徑得到:操作系統
每個命令行均必須含用命令名稱,這是不能缺乏的。命令行
echo
是一個很是簡單、直接的 Linux 命令:
將 argument 送出至標準輸出(STDOUT),一般就是在監視器(monitor)上輸出。
先運行一下echo
命令:
$ echo $
會發現只有一個空白行,而後又回到 shell prompt 上了。
這是由於 echo
在預設上,在顯示完 argument 以後,還會送出一個換行符號(new-line
charactor)。
可是上面的 command 並沒任何的 argument ,那結果就只剩一個換行符號了...
若你要取消這個換行符號,可利用 echo
的 -n option
:
$ echo -n $
要想看看 echo
的 argument ,可試試以下的輸入:
$ echo hello hello $ echo -n hello hello$
上兩個 echo
命令中,你會發現 argument 的部份顯示在你的熒幕,而換行符號則視 -n option
而定。
很明顯的,第二個 echo
因爲換行符號被取消了,接下來的 shell prompt 就接在輸出結果同
一行了。
事實上, echo
除了 -n options
以外,經常使用選項還有:
-e :啓用反斜線控制字符的轉換 -E:關閉反斜線控制字符的轉換 -n :取消行末之換行符號
關於 echo
命令所支持的反斜線控制字符以下表:
\a: ALERT / BELL (從系統喇叭送出鈴聲) \b: BACKSPACE ,也就是向左刪除鍵 \c:取消行末之換行符號 \E: ESCAPE,跳脫鍵 \f: FORMFEED,換頁字符 \n: NEWLINE,換行字符 \r: RETURN,回車鍵 \t: TAB,表格跳位鍵 \v: VERTICAL TAB,垂直表格跳位鍵 \n: ASCII 八進位編碼(以 x 開首爲十六進制) \\:反斜線自己
" "
和‘ ’
的區別?通過前面兩章的學習,應該很清楚當你在 shell prompt 後面敲打鍵盤、直到按下 Enter 的時
候,你輸入的文字就是 command line 了,而後 shell 纔會以行程的方式執行你所交給它的命令。
可是,在 command line 輸入的每個文字,對 shell 來講,是有類別之分的!
簡單而言, command line 的每個 charactor ,分爲以下兩種:
Literal 沒甚麼好談的,凡舉 abcd、 123456 這些"文字"都是 literal ,但 meta 卻常使咱們困惑。
事實上,前兩章咱們在 command line 中已碰到兩個機乎每次都會碰到的 meta :
<space>
或 <tab>
或 <enter>
三者之一組成(咱們經常使用 space )。<enter>
產生。IFS 是用來拆解 command line 的每個詞(word)用的,由於 shell command line 是按詞來處理的。
而 CR 則是用來結束 command line 用的,這也是爲什麼咱們敲
除了 IFS 與 CR ,經常使用的 meta 還有:
= : 設定變量。 $ : 做變量或運算替換(請不要與 shell prompt 搞混了)。 > :重導向 stdout。 < :重導向 stdin。 | :命令管線。 & :重導向 file descriptor ,或將命令置於背境執行。 ( ) :將其內的命令置於 nested subshell 執行,或用於運算或命令替換。 { } :將其內的命令置於 non-named function 中執行,或用在變量替換的界定範圍。 ; :在前一個命令結束時,而忽略其返回值,繼續執行下一個命令。 && :在前一個命令結束時,若返回值爲 true,繼續執行下一個命令。 || :在前一個命令結束時,若返回值爲 false,繼續執行下一個命令。 ! :執行 history 列表中的命令
假如咱們須要在 command line 中將這些保留字符的功能關閉的話,就須要 quoting 處理了。在 bash 中,經常使用的 quoting 有以下三種方法:
' '
(單引號),凡在 hard quote 中的全部 meta 均被關閉。" "
(雙引號),在 soft quoe 中大部份 meta 都會被關閉,但某些則保留(如$ )。下面的例子將有助於咱們對 quoting 的瞭解:
$ A=B C # 空格鍵未被關掉,做爲 IFS 處理。 $ C: command not found. $ echo $A $ $ A="B C" # 空格鍵已被關掉,僅做爲空格鍵處理。 $ echo $A B C
在第一次設定 A 變量時,因爲空格鍵沒被關閉, command line 將被解讀爲:
<IFS>
,再執行 C 命令。在第二次設定 A 變量時,因爲空格鍵被置於 soft quote 中,所以被關閉,再也不做爲 IFS :<space>
C空格鍵不管在 soft quote 仍是在 hard quote 中,均會被關閉。 Enter 鍵亦然。