重要基本概念:
- 管理整個硬體是核心(kernel),一般使用者(user)則是以shell來跟核心溝通。
- 替我們工作的是『硬體』,而控制硬體的是『核心』,我們使用者乃是利用『Shell』控制一些kernel提供的『工具 (Utility)』來操控硬體替我們正确的工作。
- kernel是『核心』的意思,而 Shell 是『殼』的意思。
- shell 有很多版本,例如:常聽到的 Bourne SHell (sh) 、在 Sun 裡頭預設的 C SHell、 商業上常用的 K SHell、, 還有 TCSH 等等,每一種 Shell 都各有其特點。至于 Linux 使用的這一種版本就稱為『 Bourne Again SHell (簡稱 bash) 』,這個 Shell 是 Bourne Shell 的增強版本,也是基準于GNU 的架構下發展出來。
- BASH shell是GNU計劃中重要的工具軟體,目前也是GUN作業系統中标準的shell,它主要相容于sh,并且依據一些使用者需求,而加強的shell版本,可以說目前幾乎所有的Linux distribution 都使用bash作為管理核心的主要shell。
-
BASH優點:
① 指令編修能力(類似DOS的doskey功能):『他能記憶使用過的指令』 曾經下達過的指令都被記錄下來了,記錄的檔案在你的家目錄内的 .bash_history 。~/.bash_history 記錄的是前一次登入以前所執行過的指令, 而至于這一次登入所執行的指令都被暫存在暫記憶體中,當你成功的登出系統後,該指令記憶才會記錄到 .bash_history 當中。『查詢曾經做過的舉動』如此可以知道你的執行步驟,那麼就可以追蹤您曾下達的指令,以作為除錯的工具。
② 指令與檔案補全功能: [tab] 如果想要知道系統當中所有以 c 為開頭的指令呢?就按下 c[tab] [tab] 。
③ 指令别名(alias)設定功能:alias 就可以知道目前的指令别名有哪些了。也可以直接下達指令來設定别名:alias lm=’ls -al’。
④ 工作控制(jobs)、前景背景控制:使用前、背景的控制可以讓工作進行的更為順利。工作控制(jobs)的用途則更廣, 可以讓我們随時将工作丢到背景中執行,而不怕不小心使用了 [Ctrl] + c 來停掉該程式。此外,也可以在單一登入的環境中,達到多任務的目的。
⑤ Shell scripts 的強大功能:将日常生活當中常需要下達的連續指令寫成一個檔案, 該檔案并且可以透過對談互動式的方式來進行主機的偵測工作。也可以藉由 shell 提供的環境變量及相關指令來進行設計,整個設計下來幾乎就是一個小型的程式語言。
⑥ 萬用字元:除了完整的字元串之外, bash 還支援許多的萬用字元來幫助使用者查詢與指令下達。例如想要知道 /usr/X11R6/bin 底下有多少以 xt 為開頭的檔案,使用: ls -l /usr/X11R6/bin/xt*
-
type : ① 檢視指令是否為bash的内建指令;② 找指令。
bash 的說明文檔:man bash
檢視指令是否為『内建』指令:type [-tpa] name 例如:type cd
參數:
:不加任何參數時,則 type 會顯示出那個 name 是外部指令還是 bash 内建的指令!
-t:當加入 -t 參數時,type 會将 name 以底下這些字眼顯示出他的意義。
file:表示為外部指令;
alias:表示該指令為指令别名所設定的名稱;
builtin:表示該指令為 bash 内建的指令功能;
-p:如果後面接的 name 為指令時,會顯示完整檔案名(外部指令)或顯示為内建指令;
-a:會将由 PATH 變量定義的路徑中,将所有含有 name 的指令都列出來,包含 alias
- 指令下達方法:
說明:[root@linux ~]# command [-options] parameter1 parameter2 ... 指令 選項 參數() 參數()
- 一行指令中第一個輸入的絕對是『指令(command)』或『可執行檔案』
- command 為指令的名稱,例如變換路徑的指令為 cd 等等;
- 中刮号[]并不存在于實際的指令中,而加入參數設定時,通常為 - 号,例如 -h;有時候完整參數名稱會輸入 – 符号,例如 –help;
-
parameter1 parameter2.. 為依附在 option 後面的參數,
或者是 command 的參數;
- command, -options, parameter1.. 中間以空格來區分,不論空幾格 shell 都視為一格;
- 按下 [Enter] 按鍵後,該指令就立即執行。[Enter] 按鍵為 字元,他代表着一行指令的開始啟動。
- 指令太長的時候,可以使用 \ 符号來跳脫 [Enter] 符号,使指令連續到下一行。*注意! \ 後就立刻接特殊字元。
- 在 Linux 系統中,英文大小寫字母是不一樣的。舉例來說, cd 與 CD 并不同。
-
變量:是以一組文字或符号等,來取代一些設定或者是一串保留的資料。
在下達正确的指令,應該需要指定路徑與檔案名。但是為何我們在任意路徑下都可以執行ls呢?而不需要指定路徑呢?這是因為系統已經預設了一些『搜尋路徑(PATH)』了,是以當我們執行一些指令時,系統就會按照該PATH的設定來進行指令的搜尋。而這個PATH就是所謂的變量。
如何『顯示變量』呢?使用echo這個指令。
變量的取用與設定:echo;變量設定規則:unset;
[root@linux ~]# echo $variable [root@linux ~]# echo $PATH /bin:/sbin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/X11R6/bin [root@linux ~]# echo ${PATH}
-
如何『設定』或者是『修改』 某個變量的内容?
用『等号(=)』連接配接變量與他的内容。
例如:
[root@localhost Jianan]# echo $myname [root@localhost Jianan]# myname=VBird [root@localhost Jianan]# echo $myname VBird
這樣變量名稱myname的内容就帶有VBird這個資料了。當一個變量名稱尚未被設定時,預設的内容是『空』的。并且,變量在設定時,還是需要符合某些規定的,否則會設定失敗。
規則如下:
- 變量與變量内容用等号連接配接;
- 等号兩邊不能直接接空格符;
- 變量名稱隻能是英文字母與數字,但是數字不能是開頭字元;
- 若有空格符可以使用雙引号『 ” 』或單引号『 ’ 』來将變量内容結合起來,但須要特别留意, 雙引号内的特殊字元可以保有變量特性,但是單引号内的特殊字元則僅為一般字元;
- 必要時需要以跳脫字元『 \ 』來将特殊符号 ( 如 Enter, $, , 空格符, ’ 等 ) 變成一般符号
- 在一串指令中,還需要藉由其它的指令提供的資訊,可以使用 quote 『` command 』;(特别特别注意,那個`是鍵盤上方的數字鍵 1 左邊那個按鍵,而不是單引号!)
- 若該變量為擴增變量内容時,則需以雙引号及$量名稱 如:『”$PATH”:/home』繼續累加内容;
- 若該變量需要在其它子程式執行,則需要以 export 來使變量變成環境變量, 如『 export PATH』;
- 通常大寫字元為系統預設變量,自行設定變量可以使用小寫字元,友善判斷 ( 純粹依照使用者興趣與嗜好 ) ;
- 取消變量的方法為:『 unset 變量名稱』。
規則比較複雜,可以直接看例子:
例一:設定一變量 name ,且内容為 VBird 。
例二:範例二:承上題,若變量内容為 VBird’s name 呢?[[email protected] Jianan]# 12name=VBird bash: 12name=VBird: 未找到指令... [[email protected] Jianan]# name = VBird bash: name: 未找到指令... [[email protected] Jianan]# name=VBird [[email protected] Jianan]# echo $name VBird
例三:我要在 PATH 這個變量當中『累加』:/home/dmtsai/bin 這個目錄[[email protected] Jianan]# name=VBird's name > > \ > / > ; > ' [[email protected] Jianan]# echo $name VBirds name \ / ; [[email protected] Jianan]# name="VBird's name" [[email protected]ost Jianan]# echo $name VBird's name [[email protected] Jianan]# name=VBird\'s\ name [[email protected] Jianan]# echo $name VBird's name
例四:呈範例三,我要将 name 的内容多出 “yes” 呢?[root@localhost Jianan]# PATH=$PATH:/home/dmtsai/bin [root@localhost Jianan]# PATH="$PATH":/home/dmtsai/bin
例五:如何讓我剛剛設定的 name=VBird 可以用在下個 shell 的程式?[root@localhost Jianan]# name=VBird [root@localhost Jianan]# echo $name VBird [root@localhost Jianan]# name="$name"yes [root@localhost Jianan]# echo $name VBirdyes [root@localhost Jianan]# name=${name}acb [root@localhost Jianan]# echo $name VBirdyesacb
[root@localhost Jianan]# name=VBird [root@localhost Jianan]# bash [root@localhost Jianan]# echo $name [root@localhost Jianan]# exit exit [root@localhost Jianan]# export name [root@localhost Jianan]# bash [root@localhost Jianan]# echo $name VBird [root@localhost Jianan]# exit exit
說明:什麼是子程式?就是在我目前這個shell的情況下,去啟動一個新的shell,新的那個shell就是子程式了。在一般的狀态下,父程式的自定變量是無法在子程式内使用的。但是透過export将變量變成環境變量後,就能夠在子程式下應用了。
例六:如何進入到您目前核心的子產品目錄?
[[email protected] Jianan]# cd /lib/modules [[email protected] modules]# ls -fc22.x86_64 [[email protected] modules]# cd 4.0.4-301.fc22.x86_64/ [[email protected] -fc22.x86_64]# ls build modules.dep modules.softdep kernel modules.dep.bin modules.symbols modules.alias modules.devname modules.symbols.bin modules.alias.bin modules.drm source modules.block modules.modesetting updates modules.builtin modules.networking vdso modules.builtin.bin modules.order [[email protected] -fc22.x86_64]# cd kernel/ [[email protected] kernel]# ls arch crypto drivers fs kernel lib mm net security sound
例七:取消剛剛設定的 name 這個變量内容
例八:在變量的設定中,單引号與雙引号的用途有何不同?
單引号與雙引号的最大不同在于上引号仍然可以保有變量的内容,但
這裡寫代碼片
-
變量的用途
① 簡化路徑名;
② 常常需要定義變量在script裡面。
如果能夠借由shell提供的指令重導向(或稱資料流重導向),以及管線指令。
指令總結:
1. cat etc/shells
2. ls -al —檢視目錄底下的所有檔案(包含隐藏檔)及所有的檔案屬性
3. alias –檢視目前的指令有哪些别名
4. alias lm = ‘ls -al’ –設定别名
5. ls -l /usr/X11R6/bin/xt* –使用萬用字元檢視/usr/X11R6/bin 底下有多少以 xt 為開頭的檔案
6. su root –擷取管理者身份
Linux 各個盤分别是什麼?