1. 程式人生 > >鳥哥的Linux私房菜-第10/11/12/13章(vim程序編輯器、學習bash、正則表達式與文件格式化處理、學習Shell Scripts)

鳥哥的Linux私房菜-第10/11/12/13章(vim程序編輯器、學習bash、正則表達式與文件格式化處理、學習Shell Scripts)

重定向 數據文件 bin 情況下 control 入侵檢測 nts 背景 成了

第10章 vim程序編輯器

可以將vim看做vi的進階版本,vim可以用顏色或底線等方式來顯示出一些特殊的信息。

為何要學習vim?因為:

  a. 所有的 Unix Like 系統都會內建 vi 文書編輯器,其他的文書編輯器則不一定會存在;

  b. 很多個別軟件的編輯接口都會主動呼叫 vi (例如未來會談到的 crontab, visudo, edquota 等指令);

  c. vim 具有程序編輯的能力,可以主動的以字體顏色辨別語法的正確性,方便程序設計;
  d. 因為程序簡單,編輯速度相當快速。

vi的使用

vi的三種模式:一般模式、編輯模式、指令列命令模式。

技術分享圖片

按鍵說明

第一部分:一般模式可用的按鈕說明,光標移動、復制貼上、搜尋取代等

技術分享圖片

第二部分:一般模式切換到編輯模式的可用按鍵說明

技術分享圖片

第三部分:一般模式切換到指令列模式的可用按鍵說明

技術分享圖片

註意:在 vi 中,數字很有意義。數字通常代表重復做幾次,也可能代表去到第幾行。

vim 的暫存檔、救援回復與開啟時的警告信息

當我們在使用 vim 編輯時, vim 會在與被編輯的檔案的目錄下,再建立一個名為 .filename.swp 檔案。 比如,編輯 /tmp/vitest/man.config 這個檔案時, vim 會主動的建立/tmp/vitest/.man.config.swp 暫存檔,你對 man.config 做的動作就會被記錄到這個 .man.config.swp 當中。如果你的系統因為某些原因斷線了, 導致你編輯的檔案還沒有儲存,這個時候 .man.config.swp 就能夠發揮救援的功能。

技術分享圖片

由與暫存盤存在的關系,因此 vim 會主動判斷你的這個檔案可能有些問題,在上面的圖示中 vim 提示兩點主要的問題與解決方案,分別是這樣的:
  問題一:可能有其他人或程序同時在編輯這個檔案:
由與 Linux 是多人多任務的環境,因此很可能有很多人同時在編輯同一個檔案。如果在多人共同編輯的情況下, 萬一大家同時儲存,那麽這個檔案的內容將會變的亂七八糟!為了避免這個問題,因此 vim 會出現這個警告窗口! 解決的方法則是:
  a. 找到另外那個程序或人員,請他將該 vim 的工作結束,然後你再繼續處理。
  b. 如果你只是要看該檔案的內容並的會有任何修改編輯癿行為,那麽可以選擇開啟成為只讀(O)檔案, 亦即上述畫面反白部分輸入英文『 o 』即可,其實就是 [O]pen Read-Only癿選項啦!

  問題二:在前一個 vim 癿環境中,可能因為某些丌知名原因導致 vim 中斷 (crashed):

這就是常見的不正常結束 vim 產生的後果。解決方案依據吧同癿情況而不同喔!常見的處理方法為:
  a. 如果你之前的 vim 處理動作尚未儲存,此時你應該要按下『R』,亦即使用 (R)ecover 的項目, 此時 vim 會載入 .man.config.swp 的內容,讓你自己來決定要不要儲存!這樣就能夠救回來你之前未儲存的工作。 不過那個 .man.config.swp 並不會在你結束 vim 後自動刪除,所以你離開 vim 後還得要自行刪除 .man.config.swp 才能避免每次打開這個檔案都會出現這樣的警告!
  b. 如果你確定這個暫存盤是沒有用的,那麽你可以直接按下『D』刪除掉這個暫存盤,亦即(D)elete it 這個項目即可。 此時 vim 會載入 man.config ,並且將舊的 .man.config.swp 刪除後,建立這次會使用新的 .man.config.swp 喔!

至與這個發現暫存盤警告訊息的畫面中,有出現六個可用按鈕,各按鈕的說明如下:

  a. [O]pen Read-Only:打開此檔案成為只讀檔, 可以用在你只是想要查閱該檔案內容並不想要進行編輯行為時。一般來說,在上課時,如果你是登入到同學的計算機去看他的配置文件, 結果發現其實同學他自己也在編輯時,可以使用這個模式;
  b. (E)dit anyway:還是用正常的方式打開你要編輯的那個檔案, 並布會載入暫存盤的內容。不過很容易出現兩個使用者互相改變對方的檔案等問題!不好不好!
  c. (R)ecover:就是加載暫存盤的內容,用在你要救回之前未儲存的工作。 不過當你救回來並且儲存離開 vim 後,還是要手動自行刪除那個暫存檔喔!
  d. (D)elete it:你確定那個暫存檔是無用的!那麽開啟檔案前會先將這個暫存盤刪除! 這個動作其實是比較常做的!因為你可能不確定這個暫存檔是怎麽來的,所以就刪除掉他吧!哈哈!
  e. (Q)uit:按下 q 就離開 vim ,不會進行任何動作回到命令提示字符。
  f. (A)bort:忽略這個編輯行為,感覺上與 quit 非常類似! 也會送你回到命令提示字符就是啰!

vim 的額外功能

區塊選擇(Visual Block)

技術分享圖片

多文檔編輯

vim 後面同時接多個檔案同時開啟。相關按鍵:

技術分享圖片

多窗口功能

技術分享圖片

vim 環境設定與記錄:~/.vimrc, ~/.viminfo

在 vim 做過的動作都會被記錄在 ~/.viminfo 這個檔案中。

vim 的環境設定參數有很多,如果你想要知道目前的設定值,可以在一般模式時輸入【:set all】查詢。常用的設定值:

技術分享圖片

我們可以透過配置文件來直接規定我們習慣的 vim 操作環境呢! 整體 vim 的設定值一般是放置在 /etc/vimrc 這個檔案,不過,不建議你修改他! 你可以修改 ~/.vimrc 這個檔案(預設不存在,請你自行手動建立!),將你所希望的設定值寫入! 舉例來說,可以是這樣的一個檔案:

技術分享圖片

vim 常用指令示意圖

技術分享圖片

其他 vim 使用註意事項

中文編碼問題

1. 你的 Linux 系統默人支持的語系數據:這與 /etc/sysconfig/i18n 有關;
2. 你的終端界面 (bash) 的語系: 這與 LANG 這個變量有關;
3. 你的檔案原本的編碼;
4. 開啟終端機癿的軟件,例如在 GNOME 底下的窗口接口。

事實上最重要的是上面的第三和第四點,只要這兩點的編碼一致,你就能夠正確的看到與編輯你的中文檔案。 否則就會看到一堆亂碼啦!

技術分享圖片

DOS 與 Linux 的斷行字符

DOS 與 Linux 斷行字符的不同。 我們也可以利用 cat -A 來觀察以 DOS (Windows 系統) 建立的檔案的特殊格式, 也可以發現在 DOS 使用的斷行字
符為 ^M$ ,我們稱為 CR 與 LF 兩個符號。 而在 Linux 底下,則是僅有 LF ($) 這個斷行符號。這個斷行符號對與 Linux 的影響很大喔!

在 Linux 底下的指令在開始執行時,他的判斷依據是 『Enter』,而 Linux 的 Enter 為 LF符號, 不過,由與 DOS 的斷行符號是 CRLF ,也就是多了一個 ^M 的符號出來, 在這樣的情況下,如果是一個 shell script 的程序檔案,將可能造成『程序無法執行』的狀態, 因為他會誤判程序所下達的指令內容啊。

那則麽辦啊?很簡單啊,將格式轉換成為 Linux 即可。

如果在不同系統之間復制一些純文本檔案時,千萬記得要使用 unix2dos 或 dos2unix 來轉換一下斷行格式。

技術分享圖片

eg: unix2dos -k man.config  將man.config修改成dos斷行

  dos2unix -k man.config man.config.linux  將man.config轉成man.config.linux斷行字符

語系編碼轉換

技術分享圖片

第11章 學習 bash

認識 bash 這個 shell

管理整個計算機硬件的其實是操作系統的核心 (kernel),這個核心是需要被保護的! 所以我們一般使用者就只能透過 shell 來跟核心溝通,以讓核心達到我們所想要達到的工作。 那麽系統有多少 shell 可用呢?為什麽我們要使用 bash 啊?

硬件、核心與 shell

其實殼程序的功能只是提供用戶操作系統的一個接口,因此這個殼程序需要可以呼叫其他軟件才好。 我們學過很多指令,包括 man, chmod, chown, vi, fdisk, mkfs 等等指令,這些指令都是獨立的應用程序, 但是我們可以透過殼程序 (就是指令列模式) 來操作這些應用程序,讓這些應用程序呼叫核心來運作所需的工作。

為何要學文字接口的 shell ?

文字接口的 shell :幾乎各家 distributions 使用的bash都是一樣的;

遠程管理:文字接口比較快;

Linux 的任督二脈: shell 是也!

系統的合法 shell 與 /etc/shells 功能

目前我們的 Linux (以 CentOS 5.x 為例) 有多少我們可以使用的 shells 呢? 你可以檢查一下
/etc/shells 這個檔案,至少就有底下這幾個可以用的 shells:
   /bin/sh (已經被 /bin/bash 所取代)
   /bin/bash (就是 Linux 預設的 shell)
   /bin/ksh (Kornshell 由 AT&T Bell lab. 發展出來的,兼容與 bash)
   /bin/tcsh (整合 C Shell ,提供更多的功能)
   /bin/csh (已經被 /bin/tcsh 所取代)
   /bin/zsh (基於 ksh 發展出來的,功能更強大的 shell)

為什麽我們系統上合法的 shell 要寫入 /etc/shells 這個檔案啊? 這是因為系統某些朋務在運作過程中,會去檢查使用者能夠使用的 shells ,而這些 shell 的查詢就是藉由 /etc/shells 這個檔案啰!

登入取得的 shell 記錄在 /etc/passwd 這個檔案中。

bash shell 的功能

命令編修能力(history):

  bash 的功能裏頭,相當棒的一個就是『他能記憶使用過的指令!』
因為我只要在指令列按『上下鍵』就可以找到前/後一個輸入的指令!而在很多 distribution 裏頭,默認的指令記憶功能可以到達 1000 個!也就是說, 你曾經下達過的指令幾乎都被記錄下來了。

  這麽多的指令記錄在哪裏呢?在你的家目錄內的 .bash_history 啦! 不過,需要留意的是,~/.bash_history 記錄的是前一次登入以前所執行過的指令, 而至於這一次登入所執行的指令都被暫存在內存中,當你成功註銷系統後,該指令記憶才會記錄到 .bash_history 當中!

命令與檔案補全功能: ([tab] 按鍵的好處)

  【tab】這個按鍵的功能就是在 bash 裏面才有。

命令別名設定功能:alias

工作控制、前景背景控制: (job control, foreground, background)

程序腳本化:shell scripts

通配符:Wildcard

bash shell 的內建命令:type

為了方便 shell 操作,bash已經內建了很多指令,比如 cd, umask等。

那我怎麽知道這個指令是來自外部指令(指的是其他非 bash 所提供得指令) 或是內建在 bash 當中的呢?

技術分享圖片

指令的下達

shell 的變量功能

什麽是變量

什麽是『變量』呢?簡單的說,就是讓某一個特定字符串代表不固定的內容就是了。

最大的好處就是『方便!』:

  變量的可變性與方便性;

  影響 bash 環境操作的變量;

  腳本程序設計(shell script)的好幫手

變量的取用與設定:echo,變量設定規則,unset

變量的取用:echo

技術分享圖片

變量的設定規則

1. 變量與變量內容以一個等號『=』來連結,如下所示:
『myname=VBird』
2. 等號兩邊不能直接接空格符,如下所示為錯誤:
『myname = VBird』或『myname=VBird Tsai』
3. 變量名稱只能是英文字母與數字,但是開頭字符不能是數字,如下為錯誤:
『2myname=VBird』
4. 變量內容若有空格符可使用雙引號『"』或單引號『‘』將發量內容結合起來,但雙引號內的特殊字符如 $ 等,可以保有原本的特性,如下所示:
『var="lang is $LANG"』則『echo $var』可得『lang is en_US』
  單引號內的特殊字符則僅為一般字符 (純文本),如下所示:
『var=‘lang is $LANG‘』則『echo $var』可得『lang is $LANG』
5. 可用跳脫字符『 \ 』將特殊符號(如 [Enter], $, \, 空格符, ‘等)變成一般字符;
6. 在一串指令中,還需要藉由其他的指令提供的信息,可以使用反單引號『`指令`』或 『$(指令)』。特別註意,那個 ` 是鍵盤上方的數字鍵 1 左邊那個按鍵,而不是單引號! 例如想要取得核心版本的設定:
『version=$(uname -r)』再『echo $version』可得『2.6.18-128.el5』
7. 若該變量為擴增變量內容時,則可用 "$發量名稱" 或 ${變量} 累加內容,如下所示:
『PATH="$PATH":/home/bin』
8. 若該發變量需要在其他子程序執行,則需要以 export 來使變量變成環境變量:
『export PATH』
9. 通常大寫字符為系統默認變量,自行設定變量可以使用小寫字符,方便判斷 (純粹依照使用者興趣與嗜好) ;
10. 取消變量的方法為使用 unset :『unset 變量名稱』例如取消 myname 的設定:
『unset myname』

舉例:

技術分享圖片

什麽是『子程序』呢?就是說,在我目前這個 shell 的情況下,去啟用另一個新的 shell ,新的那個shell 就是子程序啦!在一般的狀態下,父程序的自定義變量是無法在子程序內使用的。但是透過export 將變量變成環境變量後,就能夠在子程序底下應用了!

環境變量的功能

環境變量可以幫我們達到很多功能~包括家目錄的變換啊、提示字符的顯示啊、執行文件搜尋的路徑等。

目前我的shell 環境中, 有多少默認的環境變量啊?我們可以到用兩個指令來查閱,分別是 env 與 export 呢!

用 env 觀察環境變量與常見環境變量說明

技術分享圖片

上面這些變量有些什麽功用呢?底下我們就一個一個來分析:

? HOME
代表用戶的家目錄。還記得我們可以使用 cd ~ 去到自己的家目錄嗎?或者利用 cd 就可以直接回到用戶家目錄了。那就是取用這個變量啦~ 有很多程序都可能會取用動這個變量的值!
? SHELL
告知我們,目前這個環境使用的 SHELL 是哪支程序? Linux 預設使用 /bin/bash 的啦!
? HISTSIZE
這個與『歷史命令』有關,亦即是, 我們曾經下達過的指令可以被系統記錄下來,而記錄的『筆數』則是由這個值來設定的。
? MAIL
當我們使用 mail 這個指令在收信時,系統會去讀取得郵件信箱檔案 (mailbox)。
? PATH
就是執行文件搜尋的路徑啦~目錄與目錄中間以冒號(:)分割, 由於檔案的搜尋是依序由 PATH 的變量內的目錄來查詢,所以,目錄的順序也是重要的喔。
? LANG
這個重要!就是語系數據啰~徆多訊息都會用到他, 舉例來說,當我們在啟動某些 perl 的程序語言檔案時,他會主動的去分析語系數據文件, 如果發現有他無法解析的編碼語系,可能會產生錯誤喔!一般來說,我們中文編碼通常是 zh_TW.Big5 或者是 zh_TW.UTF-8,這兩個編碼偏偏不容易被解譯出來,所以,有的時候,可能需要修訂一下語系數據。
? RANDOM
這個玩意兒就是『隨機隨機數』的發量啦!目前大多數的 distributions 都會有隨機數生成器,那就是 /dev/random 這個檔案。 我們可以透過這個隨機數檔案相關的變量 ($RANDOM) 來隨機取得隨機數值喔。在 BASH 癿環境下,這個 RANDOM 變量的內容,介於 0~32767 之間,所以,你只要 echo $RANDOM 時,系統就會主勱動的隨機取出一個介於 0~32767 的數值。萬一我想要使用 0~9 之間的數值呢?呵呵~利用 declare 宣告數值類型, 然後這樣做就可以了:

技術分享圖片

用 set 觀察所有變量 (含環境變量和自定義變量)

bash 可不止有環境變量,還有一些與 bash 操作接口有的變發量,以及用戶自己定義的變量存在。那麽這些變量如何觀察呢?這個時候就得要使用 set 這個指令了。 set 除了環境變量之外, 還會將其他在 bash 內的變量通通顯示出來。信息很多,僅列出幾個重要的內容:

技術分享圖片

一般來說,不論是否為環境變量,只要跟我們目前這個 shell 的操作接口有關的變量, 通常都會被設定為大寫字符,也就是說,『基本上,在 Linux 預設的情況中,使用{大寫的字母}來設定的變量一般為系統內定需要的變量』。有哪些是比較重要的?

  PS1:提示字符的設定

  $:關於本 shell 的PID

  ?:關於上個執行指令的回傳值

  OSTYPE, HOSTTYPE, MACHTYPE:主機硬件與核心的等級

export:自定義變量轉成環境變量

環境變量與自定義變量的區別:該變量是否會被子程序繼續引用。子程序僅會繼承父程序的環境變量,不會繼承自定義變量。

登入Linux並取得一個 bash 後,bash 就是一支獨立的程序,被稱為PID的就是。接下來你在這個 bash 底下所下達的任何指令都是由這個 bash 所衍生出來的,那些被下達的指令 就稱為子程序。

把自定義變量變成環境變量:語法:export 變量名稱

影響顯示結果的語系變量(locale)

查詢linux支持的語系(/usr/lib/locale):

技術分享圖片

修訂編碼:

技術分享圖片

系統默認的語系定義在:/etc/sysconfig/i18n

變量的有效範圍

為什麽環境變量的數據可以被子程序所引用呢?這是因為內存配置的關系!理論上是這樣的:
   當啟動一個 shell,操作系統會分配一記憶區塊給 shell 使用,此內存內變量可讓子程序取用
   若在父程序用 export 功能,可以讓自定義變量的內容寫到上述的記憶區塊當中(環境變量);
   當加載另一個 shell 時 (亦即啟動子程序,而離開原本的父程序了),子 shell 可以將父 shell 的環境變量所在的記憶區塊導入自己的環境發量區塊當中

變量鍵盤讀取、數組與宣告:read, array, declare

read:讀取來至鍵盤輸入的變量

技術分享圖片

declare/typeset

declare 或 typeset 是一樣的功能,就是在『宣告變量的類型』。如果使用 declare 後面並沒有接任何參數,那麽 bash 就會主動的將所有的變量名稱與內容通通叫出來,就好像使用 set 一樣。

技術分享圖片

如果你不小心將變量設定為『只讀』,通常得要註銷再登入才能復原該變量的類型。

數組(array)變量類型

在 bash 裏面,數組的設定方式:arrayName[index]=content

技術分享圖片

與文件系統及程序的限制關系:ulimit

我們的 bash 是可以『限制用戶的某些系統資源』癿,包括可以開啟的檔案數量, 可以使用的 CPU時間,可以使用的內存總量等等。如何設定?用 ulimit 吧!

技術分享圖片

變量內容的刪除、取代與替換

變量內容的刪除與取代

技術分享圖片

技術分享圖片

變量的測試與內容替換

命令別名與歷史命令:

命令別名設定:alias, unalias

歷史命令:history

bash shell 的操作環境:

路徑與指令搜尋順序

bash 的進站與歡迎信息:/etc/issue, /etc/motd

bash 的環境配置文件

終端機的環境設定:stty, set

通配符與特殊符號

技術分享圖片

技術分享圖片

數據流重導向

數據流重導向就是將某個指令執行後應該要出現在屏幕上的數據,傳遞到其他地方。

什麽是數據流重導向?

技術分享圖片

簡單的說,標準輸出指的是『指令執行所回傳的正確的訊息』,而標準錯誤輸出可理解為『 指令執行失敗後,所回傳的錯誤訊息』。

standard output 與 standard error output

數據流重導向可以將 standard output(簡稱 stdout) 與 standard error output (簡稱 stderr) 分別傳送到其他的檔案或裝置去,而分別傳送所用的特殊字符則如下所示:
1. 標準輸入 (stdin) :代碼為 0 ,使用 < 或<< ;
2. 標準輸出 (stdout):代碼為 1 ,使用 > 或 >> ;
3. 標準錯諢輸出(stderr):代碼為 2 ,使用 2> 或 2>> ;

   1> :以覆蓋的方法將『正確的數據』輸出到指定的檔案或裝置上;
   1>>:以累加的方法將『正確的數據』輸出到指定的檔案或裝置上;
   2> :以覆蓋的方法將『錯誤的數據』輸出到指定的檔案或裝置上;
   2>>:以累加的方法將『錯誤的數據』輸出到指定的檔案或裝置上;

/dev/null 垃圾桶黑洞裝置與特殊寫法

如果我知道錯誤訊息會發生,所以要將錯誤訊息忽略掉而並顯示或儲存呢? 這個時候黑洞裝置 /dev/null 就很重要了!這個 /dev/null 可以吃掉任何導向這個裝置的信息

技術分享圖片

如果我要將正確與錯誤數據通通寫入同一個檔案去呢?這個時候就得要使用特殊的寫法了! 我們同樣用底下的案例來說明:

技術分享圖片

standard input:< 與 <<

<:將原本需要由鍵盤輸入的數據,改由檔案內容取代。

技術分享圖片

<<:結束的輸入字符。

技術分享圖片

為何要使用命令輸出重導向?

   屏幕輸出的信息很重要,而且我們需要將他存下來的時候;
   背景執行中的程序,並希望他幹擾屏幕正常的輸出結果時;
   一些系統的例行命令 (例如寫在 /etc/crontab 中的檔案) 的執行結果,希望他可以存下來時;
   一些執行命令的可能已知錯誤訊息時,想以『 2> /dev/null 』將他丟掉時;
   錯誤訊息與正確訊息需要分別輸出時。

命令執行的判斷依據: ;, &&, ll

技術分享圖片

管線命令(pipe)

bash 命令執行時有輸出數據出現,如果輸出的數據需要經過幾道手續後才能得到我們想要的格式,應該如何設定呢?這就牽涉到管線命令,管線命令使用【|】界定符號。

如果我們想知道 /etc 下有多少檔案,可以用 ls /etc 來查詢,不過因為檔案太多,一下把屏幕塞滿了,不知道前面輸出的內容,此時,可以使用 less 協助:ls -al /etc | less

管線命令只能處理由前面一個指令傳來的正確信息,也就是 standard output 的信息,對於 standard error 並沒有直接處理的能力。

技術分享圖片

每個管線後面接的第一個數據必定是指令,而且這個指令必須能夠接受 standard input 的數據才行,這樣的指令來可以是管線命令,例如less, more, head, tail等。

擷取命令:cut, grep

什麽是擷取命令:講一段數據經過分析後,取出我們想要的。或者經由分析關鍵詞,取出我們想要的哪一行。一般來說,擷取信息通常是針對一行一行來分析的。

cat:將一段信息的某一段切出來,處理信息以行為單位

技術分享圖片

grep:分析一行信息,若當中有我們需要的信息,就將該行拿出來

技術分享圖片

排序命令:sort, wc, uniq

sort

技術分享圖片

uniq

如果我排序完成了,想要將重復的資料僅列出一個顯示,可以怎麽做呢?

技術分享圖片

wc

技術分享圖片

雙向重導向:tee

tee 會同時將數據流分送到檔案去與屏幕 (screen);而輸出到屏幕的,其實就是 stdout ,可以讓下個指令繼續處理喔!

技術分享圖片

字符轉換命令:tr, col, join, paste, expand

tr 可以用來刪除一段訊息當中的文字,或者是進行文字訊息的替換!

技術分享圖片

col

技術分享圖片

join

技術分享圖片

paste

技術分享圖片

expand

技術分享圖片

分割命令:split

技術分享圖片

參數代換:xargs

xargs 可以讀入 stdin 的數據,並且以空格符或斷行字符作為分辨,將 stdin 的資料分割成為 arguments 。 因為是以空格符作為分割,所以,如果有一些檔名或者是其他意義的名詞內含有空格符的時候, xargs 可能就會誤判了

技術分享圖片

會使用 xargs 的原因是, 很多指令其實並不支持管線命令,因此我們可以透過 xargs 來提供該指令引用 standard input !舉例說:

技術分享圖片

關於減號 - 的用途

在管線命令當中,常常會使用到前一個指令的 stdout 作為這次的stdin , 某些指令需要用到文件名 (例如 tar) 來進行處理時,該 stdin 與 stdout 可以利用減號 "-" 來替
代, 舉例來說:

技術分享圖片

上面這個例子是說:『我將 /home 裏面的檔案給他打包,但打包的數據不是記錄到檔案,而是傳送別stdout; 經過管線後,將 tar -cvf - /home 傳送給後面的 tar -xvf - 』。後面的這個 - 則是取用前一個指令的 stdout, 因此,我們就不需要使用 file 了!這是很常見的例子喔!註意註意!

第13章 學習 shell script

什麽是 shell script?

shell script 是針對 shell 編寫的腳本。shell script 是利用shell的功能編寫的一個程序,這個程序使用純文本文件,將一些shell的語法與指令(含外部指令)寫在裏面,搭配正則表達式、管線命令和數據流重定向等功能,以達到我們想要的處理目的。

為什麽要學習 shell script?

  自動化管理的重要依據

  追蹤與管理系統的重要工作

  簡單入侵檢測功能

  連續指令單一化

  簡易的數據處理

  跨平臺支持與學習歷程較短

第一支 script 的編寫與執行

編寫 shell script 的註意事項:

  a. 指令的執行是從上而下、從左而右的分析與執行;

  b. 指令、選項與參數間的多個空白都會被忽略掉;

  c. 空白行也將被忽略掉,並且 [tab] 按鍵所推開的空白同樣規為空格鍵;

  d. 如果讀取到一個 Enter 符號 (CR) ,就嘗試開始執行該行 (或該串) 命令;

  e. 至於如果一行的內容太多,則可以使用『 \[Enter] 』來延伸至下一行;

  f. 『 # 』可做為批註!任何加在 # 後面的資料將全部被規為批註文字而被忽略!

鳥哥的Linux私房菜-第10/11/12/13章(vim程序編輯器、學習bash、正則表達式與文件格式化處理、學習Shell Scripts)