天天看點

Linux-Bash Shell

重要基本概念:

  1. 管理整個硬體是核心(kernel),一般使用者(user)則是以shell來跟核心溝通。
  2. 替我們工作的是『硬體』,而控制硬體的是『核心』,我們使用者乃是利用『Shell』控制一些kernel提供的『工具 (Utility)』來操控硬體替我們正确的工作。
  3. kernel是『核心』的意思,而 Shell 是『殼』的意思。
  4. shell 有很多版本,例如:常聽到的 Bourne SHell (sh) 、在 Sun 裡頭預設的 C SHell、 商業上常用的 K SHell、, 還有 TCSH 等等,每一種 Shell 都各有其特點。至于 Linux 使用的這一種版本就稱為『 Bourne Again SHell (簡稱 bash) 』,這個 Shell 是 Bourne Shell 的增強版本,也是基準于GNU 的架構下發展出來。
  5. BASH shell是GNU計劃中重要的工具軟體,目前也是GUN作業系統中标準的shell,它主要相容于sh,并且依據一些使用者需求,而加強的shell版本,可以說目前幾乎所有的Linux distribution 都使用bash作為管理核心的主要shell。
  6. 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*

  7. 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

  8. 指令下達方法:
    [root@linux ~]# command [-options] parameter1 parameter2 ...
                      指令       選項      參數()     參數()
               
    說明:
    1. 一行指令中第一個輸入的絕對是『指令(command)』或『可執行檔案』
    2. command 為指令的名稱,例如變換路徑的指令為 cd 等等;
    3. 中刮号[]并不存在于實際的指令中,而加入參數設定時,通常為 - 号,例如 -h;有時候完整參數名稱會輸入 – 符号,例如 –help;
    4. parameter1 parameter2.. 為依附在 option 後面的參數,

      或者是 command 的參數;

    5. command, -options, parameter1.. 中間以空格來區分,不論空幾格 shell 都視為一格;
    6. 按下 [Enter] 按鍵後,該指令就立即執行。[Enter] 按鍵為 字元,他代表着一行指令的開始啟動。
    7. 指令太長的時候,可以使用 \ 符号來跳脫 [Enter] 符号,使指令連續到下一行。*注意! \ 後就立刻接特殊字元。
    8. 在 Linux 系統中,英文大小寫字母是不一樣的。舉例來說, cd 與 CD 并不同。
  9. 變量:是以一組文字或符号等,來取代一些設定或者是一串保留的資料。

    在下達正确的指令,應該需要指定路徑與檔案名。但是為何我們在任意路徑下都可以執行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}
               
  10. 如何『設定』或者是『修改』 某個變量的内容?

    用『等号(=)』連接配接變量與他的内容。

    例如:

    [root@localhost Jianan]# echo $myname
    
    [root@localhost Jianan]# myname=VBird
    [root@localhost Jianan]# echo $myname
    VBird
               

    這樣變量名稱myname的内容就帶有VBird這個資料了。當一個變量名稱尚未被設定時,預設的内容是『空』的。并且,變量在設定時,還是需要符合某些規定的,否則會設定失敗。

    規則如下:

    1. 變量與變量内容用等号連接配接;
    2. 等号兩邊不能直接接空格符;
    3. 變量名稱隻能是英文字母與數字,但是數字不能是開頭字元;
    4. 若有空格符可以使用雙引号『 ” 』或單引号『 ’ 』來将變量内容結合起來,但須要特别留意, 雙引号内的特殊字元可以保有變量特性,但是單引号内的特殊字元則僅為一般字元;
    5. 必要時需要以跳脫字元『 \ 』來将特殊符号 ( 如 Enter, $, , 空格符, ’ 等 ) 變成一般符号
    6. 在一串指令中,還需要藉由其它的指令提供的資訊,可以使用 quote 『` command 』;(特别特别注意,那個`是鍵盤上方的數字鍵 1 左邊那個按鍵,而不是單引号!)
    7. 若該變量為擴增變量内容時,則需以雙引号及$量名稱 如:『”$PATH”:/home』繼續累加内容;
    8. 若該變量需要在其它子程式執行,則需要以 export 來使變量變成環境變量, 如『 export PATH』;
    9. 通常大寫字元為系統預設變量,自行設定變量可以使用小寫字元,友善判斷 ( 純粹依照使用者興趣與嗜好 ) ;
    10. 取消變量的方法為:『 unset 變量名稱』。

    規則比較複雜,可以直接看例子:

    例一:設定一變量 name ,且内容為 VBird 。

    [[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
               
    例二:範例二:承上題,若變量内容為 VBird’s name 呢?
    [[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
               
    例三:我要在 PATH 這個變量當中『累加』:/home/dmtsai/bin 這個目錄
    [root@localhost Jianan]# PATH=$PATH:/home/dmtsai/bin
    [root@localhost Jianan]# PATH="$PATH":/home/dmtsai/bin
               
    例四:呈範例三,我要将 name 的内容多出 “yes” 呢?
    [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
               
    例五:如何讓我剛剛設定的 name=VBird 可以用在下個 shell 的程式?
    [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 這個變量内容

    例八:在變量的設定中,單引号與雙引号的用途有何不同?

    單引号與雙引号的最大不同在于上引号仍然可以保有變量的内容,但

    這裡寫代碼片
               
  11. 變量的用途

    ① 簡化路徑名;

    ② 常常需要定義變量在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 各個盤分别是什麼?

繼續閱讀