1. 程式人生 > >Linux學習筆記23——認識 BASH 這個 Shell、Shell 的變數功能

Linux學習筆記23——認識 BASH 這個 Shell、Shell 的變數功能

在 Linux 的環境下,如果你不懂 bash 是什麼,那麼其他的東西就不用學了!因為前面幾章我們使用終端機下達指令的方式, 就是通過 bash 的環境來處理的喔!所以說,他很重要吧!bash 的東西非常的多,包括變數的設定與使用、 bash 操作環境的建立、資料流重導向的功能,還有那好用的管線命令!好好清一清腦門,準備用功去囉~ ^_^ 這個章節幾乎是所有命令列介面 (command line) 與未來主機維護與管理的重要基礎,一定要好好仔細的閱讀喔!

一、認識 BASH 這個 Shell

我們在第一章 Linux 是什麼當中提到了: 管理整個計算機硬體的其實是作業系統的核心(kernel),這個核心是需要被保護的! 所以我們一般使用者就只能通過 shell 來跟核心溝通,以讓核心達到我們所想要達到的工作。 那麼系統有多少 shell 可用呢?為什麼我們要使用bash 啊?下面分別來談一談喔!

1,硬體、核心與 Shell

這應該是個蠻有趣的話題:“什麼是 Shell ”?相信只要摸過計算機,對於作業系統 (不論是Linux 、 Unix 或者是 Windows) 有點概念的朋友們大多聽過這個名詞,因為只要有“作業系統”那麼就離不開 Shell 這個東西。不過,在討論 Shell 之前,我們先來了解一下計算機的執行狀況吧! 舉個例子來說:當你要計算機傳輸出來“音樂”的時候,你的計算機需要什麼東西呢?

1. 硬體:當然就是需要你的硬體有“音效卡晶片”這個配備,否則怎麼會有聲音;

2. 核心管理:作業系統的核心可以支援這個晶片組,當然還需要提供晶片的驅動程式囉;

3. 應用程式:需要使用者 (就是你) 輸入發生聲音的指令囉!

 

這就是基本的一個輸出聲音所需要的步驟!也就是說,你必須要“輸入”一個指令之後, “硬體”才會通過你下達的指令來工作!那麼硬體如何知道你下達的指令呢?那就是 kernel (核心) 的控制工作了!也就是說,我們必須要通過“ Shell ”將我們輸入的指令與 Kernel 溝通,好讓 Kernel 可以控制硬體來正確無誤的工作! 基本上,我們可以通過下面這張圖來說明一下:

我們在第零章內的作業系統小節曾經提到過, 作業系統其實是一組軟體,由於這組軟體在控制整個硬體與管理系統的活動監測, 如果這組軟體能被使用者隨意的操作,若使用者應用不當,將會使得整個系統崩潰!因為作業系統管理的就是整個硬體功能嘛! 所以當然不能夠隨便被一些沒有管理能力的終端使用者隨意使用囉!

但是我們總是需要讓使用者作業系統的,所以就有了在作業系統上面發展的應用程式啦!使用者可以通過應用程式來指揮核心, 讓核心達成我們所需要的硬體任務!如果考慮如第零章所提供的作業系統圖示(圖0.4.2), 我們可以發現應用程式其實是在最外層,就如同雞蛋的外殼一樣,因此這個咚咚也就被稱呼為殼程式 (shell) 囉!

其實殼程式的功能只是提供使用者作業系統的一個介面,因此這個殼程式需要可以呼叫其他軟體才好。 我們在第四章到第九章提到過很多指令,包括 man, chmod, chown, vi, fdisk,mkfs 等等指令,這些指令都是獨立的應用程式, 但是我們可以通過殼程式 (就是命令列介面) 來操作這些應用程式,讓這些應用程式呼叫核心來執行所需的工作哩! 這樣對於殼程式是否有了一定的概念了?

Tips 也就是說,只要能夠操作應用程式的介面都能夠稱為殼程式。狹義的殼程式指的是命令列方面的軟體,包括本章要介紹的 bash 等。 廣義的殼程式則包括圖形介面的軟體!因為圖形介面其實也能夠操作各種應用程式來呼叫核心工作啊! 不過在本章中,我們主要還是在使用 bash 啦!

 

2,為何要學命令列的 shell?

命令列的 shell 是很不好學的,但是學了之後好處多多!所以, 在這裡鳥哥要先對您進行一些心理建設,先來了解一下為啥學習 shell 是有好處的,這樣你才會有信心繼續玩下去 ^_^

命令列的 shell:大家都一樣!

鳥哥常常聽到這個問題:“我幹嘛要學習 shell 呢? 不是已經有很多的工具可以提供我設定我的主機了?我為何要花這麼多時間去學指令呢?不是以 X Window 按一按幾個按鈕就可以搞定了嗎?”唉~還是得一再地強調, X Window 還有 Web 介面的設定工具例如 Webmin [1] 是真的好用的傢伙, 他真的可以幫助我們很簡易的設定好我們的主機,甚至是一些很進階的設定都可以幫我們搞定。

但是鳥哥在前面的章節裡面也已經提到過相當多次了, X Window 與 web 介面的工具,他的介面雖然好友,功能雖然強大, 但畢竟他是將所有利用到的軟體都整合在一起的一組應用程式而已, 並非是一個完整的套件,所以某些時候當你升級或者是使用其他套件管理模組 (例如 tarball 而非 rpm 檔案等等) 時,就會造成設定的困擾了。甚至不同的 distribution 所設計的 X window 介面也都不相同,這樣也造成學習方面的困擾。

命令列的 shell 就不同了!幾乎各家 distributions 使用的 bash 都是一樣的!如此一來, 你就能夠輕輕鬆鬆的轉換不同的 distributions ,就像武俠小說裡面提到的“一法通、萬法通!”

遠端管理:命令列就是比較快!

此外,Linux 的管理常常需要通過遠端連線,而連線時命令列的傳輸速度一定比較快, 而且,較不容易出現斷線或者是資訊外流的問題,因此,shell 真的是得學習的一項工具。而且,他可以讓您更深入 Linux ,更瞭解他,而不是隻會按一按滑鼠而已!所謂“天助自助者!”多摸一點文字模式的東西,會讓你與 Linux 更親近呢!

Linux 的任督二脈: shell 是也

有些朋友也很可愛,常會說:“我學這麼多幹什麼? 又不常用,也用不到!”嘿嘿!有沒有聽過“書到用時方恨少?” 當你的主機一切安然無恙的時候,您當然會覺得好像學這麼多的東西一點幫助也沒有呀! 萬一,某一天真的不幸給他中標了,您該如何是好?是直接重新安裝?還是先追蹤入侵來源後進行漏洞的修補?或者是乾脆就關站好了?這當然涉及很多的考慮,但就以鳥哥的觀點來看,多學一點總是好的,尤其我們可以有備而無患嘛!甚至學的不精也沒有關係,瞭解概念也就 OK 啦!畢竟沒有人要您一定要背這麼多的內容啦!瞭解概念就很了不起了!

此外,如果你真的有心想要將您的主機管理的好,那麼良好的 shell 程式編寫是一定需要的啦!就鳥哥自己來說,鳥哥管理的主機雖然還不算多, 只有區區不到十部,但是如果每部主機都要花上幾十分鐘來查閱他的登入檔案資訊以及相關的訊息, 那麼鳥哥可能會瘋掉!基本上,也太沒有效率了!這個時候,如果能夠藉由 shell 提供的資料流重導向以及管線命令,呵呵! 那麼鳥哥分析登入資訊只要花費不到十分鐘就可以看完所有的主機之重要資訊了!相當的好用呢!

由於學習 shell 的好處真的是多多啦!所以,如果你是個系統管理員,或者有心想要管理系統的話,那麼 shell 與 shell scripts 這個東西真的有必要看一看!因為他就像“打通任督二脈,任何武功都能隨你應用”的說

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

知道什麼是 Shell 之後,那麼我們來了解一下 Linux 使用的是哪一個 shell 呢?什麼!哪一個?難道說 shell 不就是“一個 shell 嗎?”哈哈!那可不!由於早年的 Unix 年代,發展者眾,所以由於 shell 依據發展者的不同就有許多的版本,例如常聽到的 Bourne SHell (sh) 、在Sun 裡頭預設的 C SHell、 商業上常用的 K SHell、, 還有 TCSH 等等,每一種 Shell 都各有其特點。至於 Linux 使用的這一種版本就稱為“ Bourne Again SHell (簡稱 bash) ”,這個Shell 是 Bourne Shell 的增強版本,也是基準於 GNU 的架構下發展出來的呦!

在介紹 shell 的優點之前,先來說一說 shell 的簡單歷史吧[2]:第一個流行的 shell 是由Steven Bourne 發展出來的,為了紀念他所以就稱為 Bourne shell ,或直接簡稱為 sh !而後來另一個廣為流傳的 shell 是由柏克萊大學的 Bill Joy 設計依附於 BSD 版的 Unix 系統中的shell ,這個 shell 的語法有點類似 C 語言,所以才得名為 C shell ,簡稱為 csh !由於在學術界 Sun 主機勢力相當的龐大,而 Sun 主要是 BSD 的分支之一,所以 C shell 也是另一個很重要而且流傳很廣的 shell 之一 。

Tips 由於 Linux 為 C 程式語言撰寫的,很多程式設計師使用 C 來開發軟體,因此 C shell 相對的就很熱門了。 另外,還記得我們在第一章、Linux 是什麼提到的吧? Sun 公司的創始人就是 Bill Joy,而 BSD 最早就是 Bill Joy 發展出來的啊。

那麼目前我們的 Linux (以 CentOS 7.x 為例) 有多少我們可以使用的 shells 呢? 你可以檢查一下 /etc/shells 這個檔案,至少就有下面這幾個可以用的 shells (鳥哥省略了重複的 shell了!包括 /bin/sh 等於 /usr/bin/sh 囉!):

/bin/sh (已經被 /bin/bash 所取代)

/bin/bash (就是 Linux 預設的 shell)

/bin/tcsh (整合 C Shell ,提供更多的功能)

/bin/csh (已經被 /bin/tcsh 所取代)

 

雖然各家 shell 的功能都差不多,但是在某些語法的下達方面則有所不同,因此建議你還是得要選擇某一種 shell 來熟悉一下較佳。 Linux 預設就是使用 bash ,所以最初你只要學會 bash就非常了不起了! ^_^! 另外,咦!為什麼我們系統上合法的 shell 要寫入 /etc/shells 這個檔案啊? 這是因為系統某些服務在執行過程中,會去檢查使用者能夠使用的 shells ,而這些shell 的查詢就是藉由 /etc/shells 這個檔案囉!

舉例來說,某些 FTP 網站會去檢查使用者的可用 shell ,而如果你不想要讓這些使用者使用FTP 以外的主機資源時,可能會給予該使用者一些怪怪的 shell,讓使用者無法以其他服務登陸主機。 這個時候,你就得將那些怪怪的 shell 寫到 /etc/shells 當中了。舉例來說,我們的CentOS 7.x 的 /etc/shells 裡頭就有個 /sbin/nologin 檔案的存在,這個就是我們說的怪怪的shell 囉~

那麼,再想一想,我這個使用者什麼時候可以取得 shell 來工作呢?還有, 我這個使用者預設會取得哪一個 shell 啊?還記得我們在第四章的在終端介面登陸linux小節當中提到的登陸動作吧? 當我登陸的時候,系統就會給我一個 shell 讓我來工作了。 而這個登陸取得的 shell 就記錄在 /etc/passwd 這個檔案內!這個檔案的內容是啥?

[[email protected] ~]$ cat /etc/passwd

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

.....(下面省略).....

 

如上所示,在每一行的最後一個數據,就是你登陸後可以取得的預設的 shell 啦!那你也會看到, root 是 /bin/bash ,不過,系統帳號 bin 與 daemon 等等,就使用那個怪怪的/sbin/nologin 囉~關於使用者這部分的內容,我們留在第十三章的帳號管理時提供更多的說明。

 

4,Bash shell 的功能

既然 /bin/bash 是 Linux 預設的 shell ,那麼總是得了解一下這個玩意兒吧!bash 是 GNU 計劃中重要的工具軟體之一,目前也是 Linux distributions 的標準 shell 。 bash 主要相容於 sh,並且依據一些使用者需求而加強的 shell 版本。不論你使用的是那個 distribution ,你都難逃需要學習 bash 的宿命啦!那麼這個 shell 有什麼好處,幹嘛 Linux 要使用他作為預設的shell 呢? bash 主要的優點有下面幾個:

命令編修能力 (history):

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

這麼多的指令記錄在哪裡呢?在你的主資料夾內的 .bash_history 啦! 不過,需要留意的是,~/.bash_history 記錄的是前一次登陸以前所執行過的指令, 而至於這一次登陸所執行的指令都被暫存在記憶體中,當你成功的登出系統後,該指令記憶才會記錄到 .bash_history 當中!

這有什麼優點呢?最大的好處就是可以“查詢曾經做過的舉動!” 如此可以知道你的執行步驟,那麼就可以追蹤你曾下達過的指令,以作為除錯的重要流程! 但如此一來也有個煩惱,就是如果被駭客入侵了,那麼他只要翻你曾經執行過的指令, 剛好你的指令又跟系統有關(例如直接輸入 MySQL 的密碼在命令列上面),那你的伺服器可就傷腦筋了! 到底記錄指令的數目越多還是越少越好?這部份是見仁見智啦,沒有一定的答案的。

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

還記得我們在第四章內的重要的幾個熱鍵小節當中提到的 [tab] 這個按鍵嗎?這個按鍵的功能就是在 bash 裡頭才有的啦!常常在 bash 環境中使用 [tab] 是個很棒的習慣喔!因為至少可以讓你 1)少打很多字; 2)確定輸入的資料是正確的! 使用 [tab] 按鍵的時機依據 [tab] 接在指令後或引數後而有所不同。我們再複習一次:

[Tab] 接在一串指令的第一個字的後面,則為命令補全;

[Tab] 接在一串指令的第二個字以後時,則為“檔案補齊”!

若安裝 bash-completion 軟體,則在某些指令後面使用 [tab] 按鍵時,可以進行“選項/引數的補齊”功能!

 

所以說,如果我想要知道我的環境當中所有以 c 為開頭的指令呢?就按下“ c[tab][tab] ”就好啦! ^_^! 是的!真的是很方便的功能,所以,有事沒事,在 bash shell 下面,多按幾次[tab] 是一個不錯的習慣啦!

 

命令別名設定功能: (alias)

假如我需要知道這個目錄下面的所有檔案 (包含隱藏檔案) 及所有的檔案屬性,那麼我就必須要下達“ ls -al ”這樣的指令串,唉!真麻煩,有沒有更快的取代方式?呵呵!就使用命令別名呀!例如鳥哥最喜歡直接以 lm 這個自訂的命令來取代上面的命令,也就是說, lm 會等於ls -al 這樣的一個功能,嘿!那麼要如何作呢?就使用 alias 即可!你可以在命令列輸入 alias就可以知道目前的命令別名有哪些了!也可以直接下達命令來設定別名呦:

alias lm='ls -al'

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

 

這部分我們在第十六章 Linux 程式控制中再提及! 使用前、背景的控制可以讓工作進行的更為順利!至於工作控制(jobs)的用途則更廣, 可以讓我們隨時將工作丟到背景中執行!而不怕不小心使用了 [Ctrl] + c 來停掉該程式!真是好樣的!此外,也可以在單一登陸的環境中,達到多工的目的呢!

 

程式化指令碼: (shell script)

在 DOS 年代還記得將一堆指令寫在一起的所謂的“批處理檔案”吧?在 Linux 下面的 shellscripts 則發揮更為強大的功能,可以將你平時管理系統常需要下達的連續指令寫成一個檔案, 該檔案並且可以通過對談互動式的方式來進行主機的偵測工作!也可以藉由 shell 提供的環境變數及相關指令來進行設計,哇!整個設計下來幾乎就是一個小型的程式語言了!該scripts 的功能真的是超乎鳥哥的想像之外!以前在 DOS 下面需要程式語言才能寫的東西,在Linux 下面使用簡單的 shell scripts 就可以幫你達成了!真的厲害!這部分我們在第十二章再來談!

 

萬用字元:( Wildcard)

除了完整的字串之外, bash 還支援許多的萬用字元來幫助使用者查詢與指令下達。 舉例來說,想要知道 /usr/bin 下面有多少以 X 為開頭的檔案嗎?使用:“ ls -l /usr/bin/X* ”就能夠知道囉~此外,還有其他可供利用的萬用字元, 這些都能夠加快使用者的操作呢!

總之,bash 這麼好!不學嗎?怎麼可能!來學吧! ^_^

 

5,查詢指令是否為 Bash shell 的內建命令: type

我們在第四章提到關於 Linux 的線上說明文件部分,也就是 man page 的內容,那麼 bash 有沒有什麼說明文件啊?開玩笑~ 這麼棒的東西怎麼可能沒有說明文件!請你在 shell 的環境下,直接輸入 man bash 瞧一瞧, 嘿嘿!不是蓋的吧!讓你看個幾天幾夜也無法看完的 bash說明文件,可是很詳盡的資料啊! ^_^

不過,在這個 bash 的 man page 當中,不知道你是否有察覺到,咦! 怎麼這個說明文件裡面有其他的檔案說明啊?舉例來說,那個 cd 指令的說明就在這個 man page 內? 然後我直接輸入 man cd 時,怎麼出現的畫面中,最上方竟然出現一堆指令的介紹?這是怎麼回事? 為了方便 shell 的操作,其實 bash 已經“內建”了很多指令了,例如上面提到的 cd , 還有例如umask 等等的指令,都是內建在 bash 當中的呢!

那我怎麼知道這個指令是來自於外部指令( 指的是其他非 bash 所提供的指令) 或是內建在bash 當中的呢? 嘿嘿!利用 type 這個指令來觀察即可!舉例來說:

[[email protected] ~]$ type [-tpa] name

選項與引數:

:不加任何選項與引數時,type 會顯示出 name 是外部指令還是 bash 內建指令

-t :當加入 -t 引數時,type 會將 name 以下面這些字眼顯示出他的意義:

file :表示為外部指令;

alias :表示該指令為命令別名所設定的名稱;

builtin :表示該指令為 bash 內建的指令功能;

-p :如果後面接的 name 為外部指令時,才會顯示完整檔名;

-a :會由 PATH 變數定義的路徑中,將所有含 name 的指令都列出來,包含 alias

範例一:查詢一下 ls 這個指令是否為 bash 內建?

[[email protected] ~]$ type ls

ls is aliased to `ls --color=auto' <==未加任何引數,列出 ls 的最主要使用情況

[[email protected] ~]$ type -t ls

alias <==僅列出 ls 執行時的依據

[[email protected] ~]$ type -a ls

ls is aliased to `ls --color=auto' <==最先使用 aliase

ls is /usr/bin/ls <==還有找到外部指令在 /bin/ls

範例二:那麼 cd 呢?

[[email protected] ~]$ type cd

cd is a shell builtin <==看到了嗎? cd 是 shell 內建指令

 

通過 type 這個指令我們可以知道每個指令是否為 bash 的內建指令。 此外,由於利用 type 搜尋後面的名稱時,如果後面接的名稱並不能以可執行檔案的狀態被找到, 那麼該名稱是不會被顯示出來的。也就是說, type 主要在找出“可執行檔案”而不是一般檔案檔名喔! 呵呵!所以,這個 type 也可以用來作為類似 which 指令的用途啦!找指令用的!

6,指令的下達與快速編輯按鈕

我們在第四章的開始下達指令小節已經提到過在 shell 環境下的指令下達方法,如果你忘記了請回到第四章再去回憶一下!這裡不重複說明了。 鳥哥這裡僅就反斜線 ( \) 來說明一下指令下達的方式囉!

範例:如果指令串太長的話,如何使用兩行來輸出?

[[email protected] ~]$ cp /var/spool/mail/root /etc/crontab \

> /etc/fstab /root

 

上面這個指令用途是將三個檔案複製到 /root 這個目錄下而已。不過,因為指令太長, 於是鳥哥就利用“ [Enter] ”來將 [Enter] 這個按鍵“跳脫!”開來,讓 [Enter] 按鍵不再具有“開始執行”的功能!好讓指令可以繼續在下一行輸入。 需要特別留意, [Enter] 按鍵是緊接著反斜線 ( \)的,兩者中間沒有其他字元。 因為 \ 僅跳脫“緊接著的下一個字元”而已!所以,萬一我寫成:“ \ [Enter] ”,亦即 [Enter] 與反斜線中間有一個空格時,則 \ 跳脫的是“空白鍵”而不是 [Enter]按鍵!這個地方請再仔細的看一遍!很重要!

如果順利跳脫 [Enter] 後,下一行最前面就會主動出現 > 的符號, 你可以繼續輸入指令囉!也就是說,那個 > 是系統自動出現的,你不需要輸入。

另外,當你所需要下達的指令特別長,或者是你輸入了一串錯誤的指令時,你想要快速的將這串指令整個刪除掉,一般來說,我們都是按下刪除鍵的。 有沒有其他的快速組合鍵可以協助呢?是有的!常見的有下面這些:

組合鍵

功能與示範

[ctrl]+u/[ctrl]+k

分別是從游標處向前刪除指令串 ( [ctrl]+u) 及向後刪除指令串( [ctrl]+k) 。

[ctrl]+a/[ctrl]+e

分別是讓游標移動到整個指令串的最前面 ( [ctrl]+a) 或最後面( [ctrl]+e) 。

總之,當我們順利的在終端機 ( tty) 上面登陸後, Linux 就會依據 /etc/passwd 檔案的設定給我們一個 shell ( 預設是 bash) ,然後我們就可以依據上面的指令下達方式來操作 shell,之後,我們就可以通過 man 這個線上查詢來查詢指令的使用方式與引數說明, 很不錯吧!那麼我們就趕緊更進一步來操作 bash 這個好玩的東西囉!

 

二、Shell 的變數功能

變數是 bash 環境中非常重要的一個玩意兒,我們知道 Linux 是多使用者多工的環境,每個人登陸系統都能取得一個 bash shell, 每個人都能夠使用 bash 下達 mail 這個指令來收受“自己”的郵件等等。問題是, bash 是如何得知你的郵件信箱是哪個檔案? 這就需要“變數”的幫助啦!所以,你說變數重不重要呢?下面我們將介紹重要的環境變數、變數的取用與設定等資料, 呼呼!動動腦時間又來到囉!^_^

1,什麼是變數?

變數的概念在各種語言中都是相同的,就是值得一個東東。

影響 bash 環境操作的變數

某些特定變數會影響到 bash 的環境喔!舉例來說,我們前面已經提到過很多次的那個 PATH變數! 你能不能在任何目錄下執行某個指令,與 PATH 這個變數有很大的關係。例如你下達ls 這個指令時,系統就是通過 PATH 這個變數裡面的內容所記錄的路徑順序來搜尋指令的呢!如果在搜尋完 PATH 變數內的路徑還找不到 ls 這個指令時, 就會在螢幕上顯示“command not found ”的錯誤訊息了。

如果說的學理一點,那麼由於在 Linux System 下面,所有的執行緒都是需要一個執行碼, 而就如同上面提到的,你“真正以 shell 來跟 Linux 溝通,是在正確的登陸 Linux 之後!”這個時候你就有一個 bash 的執行程式,也才可以真正的經由 bash 來跟系統溝通囉!而在進入 shell之前,也正如同上面提到的,由於系統需要一些變數來提供他資料的存取 ( 或者是一些環境的設定引數值, 例如是否要顯示彩色等等的) ,所以就有一些所謂的“環境變數” 需要來讀入系統中了!這些環境變數例如 PATH、HOME、MAIL、SHELL 等等,都是很重要的, 為了區別與自訂變數的不同,環境變數通常以大寫字元來表示呢!

指令碼程式設計 ( shell script) 的好幫手

這些還都只是系統預設的變數的目的,如果是個人的設定方面的應用呢:例如你要寫一個大型的 script 時,有些資料因為可能由於使用者習慣的不同而有差異,比如說路徑好了,由於該路徑在 script 被使用在相當多的地方,如果下次換了一部主機,都要修改 script 裡面的所有路徑,那麼我一定會瘋掉! 這個時候如果使用變數,而將該變數的定義寫在最前面,後面相關的路徑名稱都以變數來取代, 嘿嘿!那麼你只要修改一行就等於修改整篇 script 了!方便的很!所以,良好的程式設計師都會善用變數的定義!

最後我們就簡單的對“什麼是變數”作個簡單定義好了: “變數就是以一組文字或符號等,來取代一些設定或者是一串保留的資料!”, 例如:我設定了“myname”就是“VBird”,所以當你讀取 myname 這個變數的時候,系統自然就會知道!哈!那就是 VBird 啦! 那麼如何“顯示變數”呢?這就需要使用到 echo 這個指令啦!

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

說的口沫橫飛的,也不知道“變數”與“變數代表的內容”有啥關係? 那我們就將“變數”的“內容”拿出來給您瞧瞧好了。你可以利用 echo 這個指令來取用變數, 但是,變數在被取用時,前面必須要加上錢字號“ $ ”才行,舉例來說,要知道 PATH 的內容,該如何是好?

變數的取用: echo

[[email protected] ~]$ echo $variable

[[email protected] ~]$ echo $PATH

/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/dmtsai/.local/bin:/home/dmtsai/bin

[[email protected] ~]$ echo ${PATH} # 近年來,鳥哥比較偏向使用這種格式喔!

 

變數的取用就如同上面的範例,利用 echo 就能夠讀出,只是需要在變數名稱前面加上 $ ,或者是以 ${變數} 的方式來取用都可以!當然啦,那個 echo 的功能可是很多的, 我們這裡單純是拿 echo 來讀出變數的內容而已,更多的 echo 使用,請自行給他 man echo 吧! ^_^

例題:請在螢幕上面顯示出您的環境變數 HOME 與 MAIL:答: echo $HOME 或者是

echo ${HOME} , echo $MAIL 或者是 echo ${MAIL}

現在我們知道了變數與變數內容之間的相關性了,好了,那麼我要如何“設定”或者是“修改” 某個變數的內容啊?很簡單啦!用“等號( =) ”連線變數與他的內容就好啦!舉例來說: 我要將myname 這個變數名稱的內容設定為 VBird ,那麼:

[[email protected] ~]$ echo ${myname}

<==這裡並沒有任何資料~因為這個變數尚未被設定!是空的!

[[email protected] ~]$ myname=VBird

[[email protected] ~]$ echo ${myname}

VBird <==出現了!因為這個變數已經被設定了!

 

瞧!如此一來,這個變數名稱 myname 的內容就帶有 VBird 這個資料囉~ 而由上面的例子當中,我們也可以知道: 在 bash 當中,當一個變數名稱尚未被設定時,預設的內容是“空”的。另外,變數在設定時,還是需要符合某些規定的,否則會設定失敗喔!這些規則如下所示啊!

Tips 要請各位讀者注意喔,每一種 shell 的語法都不相同~在變數的使用上,bash 在你沒有設定的變數中強迫去 echo 時,它會顯示出空的值。 在其他某些 shell 中,隨便去 echo 一個不存在的變數,它是會出現錯誤訊息的喔!要注意!要注意!

變數的設定規則

變數與變數內容以一個等號“=”來連結,如下所示: “myname=VBird”

等號兩邊不能直接接空白字元,如下所示為錯誤: “myname = VBird”或“myname=VBirdTsai”

變數名稱只能是英文字母與數字,但是開頭字元不能是數字,如下為錯誤:“2myname=VBird”

變數內容若有空白字元可使用雙引號“"”或單引號“'”將變數內容結合起來,但:

雙引號內的特殊字元如 $ 等,可以保有原本的特性,如下所示: “var="lang is $LANG"”則“echo $var”可得“lang is zh_TW.UTF-8”

單引號內的特殊字元則僅為一般字元 ( 純文字) ,如下所示: “var='lang is$LANG'”則“echo $var”可得“lang is $LANG”

可用跳脫字元“ \ ”將特殊符號( 如 [Enter], $, \, 空白字元, '等) 變成一般字元,如:“myname=VBird\ Tsai”

在一串指令的執行中,還需要藉由其他額外的指令所提供的資訊時,可以使用反單引號“ 指令 ”或 “$( 指令) ”。特別注意,那個 ` 是鍵盤上方的數字鍵 1 左邊那個按鍵,而不是單引號! 例如想要取得核心版本的設定: “version=$( uname -r) ”再“echo $version”可得“3.10.0-229.el7.x86_64”