上一篇我們介紹了 Shell 的基本概念,了解了什麼是 Shell 之後,接下來就要來了解什麼是變數。
變數是 Bash 中非常重要的一個設計,而概念和程式語言所宣告的變數類似。例如 : 不同的使用者會對應到不同的設定,系統只要在使用者登入時去取得對應的值放到變數裡,當要用到時可以直接從變數取值,就不用把值寫死在程式碼裡面。
要取得變數的內容可以使用 echo
指令來達成,在取得變數內容前要在變數前面加上 $
的符號才可以。變數名稱也可以放在 {}
中。
範例
下面以 PATH
這個環境變數來作為範例,可以看到不論是有沒有加 {}
輸出的結果都是一樣的。
變數的內容設定非常直覺就是用等號 =
就可以了,但是內容上有一些規則限制。
範例
tmp 這個變數還沒設定過所以直接用 echo
顯示出來是沒有值的,接著再設定 tmp 的值之後就可以順利用 echo
指令取到值。
數字不能在開頭
,例如 :""
或是單引號 ''
裡面。
$
,會保有原本的特性。\
可以跳脫其後接的第一個字元本身的功能,這可以用來跳脫一些特殊字元,例如 : $
、Enter
、空白
等等,讓這些字元變成單純的字元沒有功能。在上一篇我們也有介紹過用反斜線來跳脫 Enter
可以讓很長的指令變成多行以利閱讀。unset
指令來解除變數。環境變數包含了使用者登入後的一些資訊,大多都是系統的設定,例如 : 系統語言、執行檔的路徑、家目錄路徑等等。和一般變數一樣這些環境變數都可以設定,但是不太會經常去改動環境變數的內容。
環境變數的用途是讓父程序下的所有子程序都可以使用這個變數。所謂的程序 (Process) 是指運作起來的程式 (Program),所以在一個運作中的程式裡面再啟動一個程式讓他運作,這就是父程序和子程序的概念。
舉例來說,Bash 的執行檔是在 /bin/bash
,而這個執行檔是一個 binary file
,也就是一個程式。所以當我們透過 /bin/bash
登入時,就是啟動了 /bin/bash
這個程式讓他變成 程序
。接著我們在 Bash 中執行 cd
指令來切換當前的路徑,而 cd
也是一個 binary file
的執行檔,路徑是 /bin/cd
,所以下了 cd
就等於是啟動了 /bin/cd
這個程式,也就會產生出一個 cd
的 程序
。這時候父程序就是 bash 程序
,而子程序就是 cd 程序
。
範例
下面這個範例我們在已經開啟的 bash 上再開一個 bash,此時再使用 ps (process status)
指令來看一下運行中的 process 狀態。
可以看到第一個程序的 PID (程序的 ID) 是 17,而 CMD (觸發程序的指令) 是 bash;第二個程序的 PPID (程序的父程序 ID) 也是 17,而 CMD (觸發程序的指令) 是 bash。從這裡就可以看出來 第二個程序是第一個程序的子程序
。
上面簡單介紹了環境變數的用途,現在要再回來看環境變數的一些操作和設定。首先可以先用 env
指令來列出所有的環境變數。
mail
指令收信,系統會去讀取信的檔案路徑。:
隔開。當下達了指令時就會 依序
到這些路徑看有沒有這個指令的執行檔。可以看到上面列出的環境變數都是大寫,LINUX 預設會使用大寫字母來設定系統的變數。
前面我們有介紹過了環境變數的用途就是用讓 子程序可以使用到父程序所定義的變數
,但是這裡要特別注意 子程序只能使用父程序設定的環境變數,而不是父程序所有自訂的變數
。因此父程序就可以透過 export
指令來將自訂的變數轉成環境變數讓子程序使用。
範例
這個範例簡單示範了父程序先自訂了一個變數,接著使用 export 指令開放成環境變數。再打開一個 bash 作為子程序後,可以正確的讀取到父程序所開放的環境變數。
如果想查看開放了哪些環境變數可以直接使用 export
指令不加變數名稱即可,如下 :
如果想要查看所有的變數,包含自訂變數和環境變數,可以使用 set
指令來查看。除了自訂變數和環境變數,bash 本身也會有一些變數,而 set
指令也會將 bash
的變數一同列出來。
語系的設定也是使用變數來記錄和設定的,可以透過 locale
指令來查看變數的設定。
這些語系的變數都可以依照自己的需求調整,不過其實只要有設定 LANG
或是 LC_ALL
,則其他的變數就會被這兩個變數自動取代。
設定前可以使用 locale -a
來查看支援哪些語系,下面列出了幾個中文的編碼,最常用的就是 zh_TW.big5
或是 zh_TW.utf8
。
如果想要 暫時
修改語系的變數,可以直接像給變數一樣給值,並且搭配 export
轉成環境變數這樣才會生效。如下 :
如果是想要永久修改語系的變數,可以打開 /etc/locale.conf
這個檔案去修改,改完後重啟系統即可完成。
上述介紹的變數設定都是直接使用指令來設定的,不過也可以讓使用者來輸入內容再存到變數裡面。例如登入會等待使用者輸入帳號、密碼,或是安裝程式會等待使用者輸入 yes/no 等等。
read 指令可以用來讀取鍵盤輸入的內容並存到變數裡,而這個指令經常被用在 Shell Script。
option :
variable name : 變數的名稱,鍵盤輸入的內容會寫進此變數。
範例
下面的範例分別以不加任何選項參數、變數設為陣列、設定提示訊息及時間限制來展示使用 read
指令的結果。
變數也可以透過宣告指定想要的類型,例如 : 陣列、整數等等。
declare
和 typeset
指令可以用於宣告變數的類型,如果沒有特別指定就會是字串。因此如果沒有指定成整數就無法進行運算。
option :
export
。variable name : 變數名稱。
範例
declare
指令,可以和前面提過的變數給值方式使用就好。宣告為陣列類型,和 read
指令不同的是 read
直接輸入陣列內容可以不須加其他符號只要透過空白隔開。而 declare
如果在宣告時要先給值則必須使用小括號 ()
將內容括起來。
另外也可以直接指定值要寫進哪一個 index。
readonly
,不可修改。可以看到下面的範例想要嘗試修改結果失敗。export
開放成環境變數。前面其實已經有介紹到了陣列的宣告,這裡再補充一下陣列也可以直接像變數一樣宣告而不一定要用 declare
。如下 :
本篇針對 Shell 的變數做了進一步的介紹,而變數大多是在撰寫 Shell Script 時才會用到,平時會用到的大概就是環境變數和語系的變數了。所以接著下一篇我們就來介紹什麼是 Shell Script 以及如何撰寫。
[1] 認識與學習BASH
[2] shell script 教學 變數的宣告
[3] How to use arrays in bash script
Linux
Shell
Bash