歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> SHELL編程 >> Shell變量之自定義變量、環境變量

Shell變量之自定義變量、環境變量

日期:2017/3/1 9:39:02   编辑:SHELL編程

1:環境變量

環境變量可以幫我們達到很多功能~包括家目錄的變換啊、提示字符的顯示啊、運行文件搜尋的路徑啊等等的那麼,既然環境變量有那麼多的功能,問一下,目前我的 shell 環境中, 有多少默認的環境變量啊?我們可以利用兩個命令來查閱,分別是 env 與 export 呢!

such as:[root@HadoopHost ~]# 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 宣告數值類型, 然後這樣做就可以了:
    [root@www ~]# declare -i number=$RANDOM*10/32768 ; echo $number
    8   <== 此時會隨機取出 0~9 之間的數值喔!
    

2:自定義變量(包含 bash 操作接口有關的變量)

除了那些環境變量外,還有一些還有一些與 bash 操作接口有關的變量以及用戶自定義的變量,這類變量改如何查詢呢?

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

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

    • PS1:(提示字符的配置)

      這是 PS1 (數字的 1 不是英文字母),這個東西就是我們的『命令提示字符』喔! 當我們每次按下 [Enter] 按鍵去運行某個命令後,最後要再次出現提示字符時, 就會主動去讀取這個變量值了。上頭 PS1 內顯示的是一些特殊符號,這些特殊符號可以顯示不同的信息, 每個 distributions 的 bash 默認的 PS1 變量內容可能有些許的差異,不要緊,『習慣你自己的習慣』就好了。 你可以用 man bash (注3)去查詢一下 PS1 的相關說明,以理解底下的一些符號意義。

      • \d :可顯示出『星期 月 日』的日期格式,如:"Mon Feb 2"
      • \H :完整的主機名。舉例來說,鳥哥的練習機為『www.vbird.tsai』
      • \h :僅取主機名在第一個小數點之前的名字,如鳥哥主機則為『www』後面省略
      • \t :顯示時間,為 24 小時格式的『HH:MM:SS』
      • \T :顯示時間,為 12 小時格式的『HH:MM:SS』
      • \A :顯示時間,為 24 小時格式的『HH:MM』
      • \@ :顯示時間,為 12 小時格式的『am/pm』樣式
      • \u :目前使用者的賬號名稱,如『root』;
      • \v :BASH 的版本信息,如鳥哥的測試主板本為 3.2.25(1),僅取『3.2』顯示
      • \w :完整的工作目錄名稱,由根目錄寫起的目錄名稱。但家目錄會以 ~ 取代;
      • \W :利用 basename 函數取得工作目錄名稱,所以僅會列出最後一個目錄名。
      • \# :下達的第幾個命令。
      • \$ :提示字符,如果是 root 時,提示字符為 # ,否則就是 $ 啰~

      好了,讓我們來看看 CentOS 默認的 PS1 內容吧:『[\u@\h \W]\$ 』,現在你知道那些反斜槓後的數據意義了吧? 要注意喔!那個反斜槓後的數據為 PS1 的特殊功能,與 bash 的變量配置沒關系啦!不要搞混了喔! 那你現在知道為何你的命令提示字符是:『 [root@www ~]# 』了吧? 好了,那麼假設我想要有類似底下的提示字符:
      [root@www /home/dmtsai 16:50 #12]#
      那個 # 代表第 12 次下達的命令。那麼應該如何配置 PS1 呢?可以這樣啊:
      [root@www ~ ]# cd /home
      [root@www home]# PS1='[\u@\h \w \A #\#]\$ '
      [root@www /home 17:02 #85]# 
      # 看到了嗎?提示字符變了!變的很有趣吧!其中,那個 #85 比較有趣,
      # 如果您再隨便輸入幾次 ls 後,該數字就會添加喔!為啥?上面有說明滴!
      
    • $:(關於本 shell 的 PID)

      錢字號本身也是個變量喔!這個咚咚代表的是『目前這個 Shell 的線程代號』,亦即是所謂的 PID (Process ID)。 更多的程序觀念,我們會在第四篇的時候提及。想要知道我們的 shell 的 PID ,就可以用:『 echo $$ 』即可!出現的數字就是你的 PID 號碼。

    • ?:(關於上個運行命令的回傳值)

      什麼?問號也是一個特殊的變量?沒錯!在 bash 裡面這個變量可重要的很! 這個變量是:『上一個運行的命令所回傳的值』, 上面這句話的重點是『上一個命令』與『回傳值』兩個地方。當我們運行某些命令時, 這些命令都會回傳一個運行後的代碼。一般來說,如果成功的運行該命令, 則會回傳一個 0 值,如果運行過程發生錯誤,就會回傳『錯誤代碼』才對!一般就是以非為 0 的數值來取代。

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

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

談了 env 與 set 現在知道有所謂的環境變量與自定義變量,那麼這兩者之間有啥差異呢?其實這兩者的差異在於『 該變量是否會被子程序所繼續引用』

如你想要讓該變量內容繼續的在子程序中使用,那麼就請運行:

[root@www ~]# export 變量名稱

我們常常在自己的主控文件後面呼叫其他附屬文件(類似函式的功能),但是主控文件與附屬文件內都有相同的變量名稱, 若一再重復配置時,要修改也很麻煩,此時只要在原本的第一個文件內配置好『 export 變量 』, 後面所呼叫的文件就能夠使用這個變量配置了!而不需要重復配置,

如果僅下達 export 而沒有接變量時,那麼此時將會把所有的『環境變量』秀出來喔!例如:(跟env作用一樣)

[root@www ~]# export
declare -x HISTSIZE="1000"
declare -x HOME="/root"
declare -x HOSTNAME="www.vbird.tsai"
declare -x INPUTRC="/etc/inputrc"
declare -x LANG="en_US"
declare -x LOGNAME="root"

4:將環境變量轉成自定義變量----declare

declare 或 typeset 是一樣的功能,就是在『說明變量的類型』。如果使用 declare 後面並沒有接任何參數,那麼 bash 就會主動的將所有的變量名稱與內容通通叫出來,就好像使用 set 一樣啦! 那麼 declare 還有什麼語法呢?看看先:

[root@www ~]# declare [-aixr] variable
選項與參數:
-a  :將後面名為 variable 的變量定義成為數組 (array) 類型
-i  :將後面名為 variable 的變量定義成為整數數字 (integer) 類型
-x  :用法與 export 一樣,就是將後面的 variable 變成環境變量;
-r  :將變量配置成為 readonly 類型,該變量不可被更改內容,也不能 unset

范例一:讓變量 sum 進行 100+300+50 的加總結果
[root@www ~]# sum=100+300+50
[root@www ~]# echo $sum
100+300+50  <==咦!怎麼沒有幫我計算加總?因為這是文字型態的變量屬性啊!
[root@www ~]# declare -i sum=100+300+50
[root@www ~]# echo $sum
450         <==瞭乎??

由於在默認的情況底下, bash 對於變量有幾個基本的定義:

  • 變量類型默認為『字符串』,所以若不指定變量類型,則 1+2 為一個『字符串』而不是『計算式』。 所以上述第一個運行的結果才會出現那個情況的;
  • bash 環境中的數值運算,默認最多僅能到達整數形態,所以 1/3 結果是 0;

現在你曉得為啥你需要進行變量聲明了吧?如果需要非字符串類型的變量,那就得要進行變量的聲明才行啦! 底下繼續來玩些其他的 declare 功能。

范例二:將 sum 變成環境變量
[root@www ~]# declare -x sum
[root@www ~]# export | grep sum
declare -ix sum="450"  <==果然出現了!包括有 i 與 x 的宣告!

范例三:讓 sum 變成只讀屬性,不可更動!
[root@www ~]# declare -r sum
[root@www ~]# sum=tesgting
-bash: sum: readonly variable  <==老天爺~不能改這個變量了!

范例四:讓 sum 變成非環境變量的自定義變量吧!
[root@www ~]# declare +x sum  <== 將 - 變成 + 可以進行『取消』動作
[root@www ~]# declare -p sum  <== -p 可以單獨列出變量的類型
declare -ir sum="450" <== 看吧!只剩下 i, r 的類型,不具有 x 啰!

5: read

要讀取來自鍵盤輸入的變量,就是用 read 這個命令了。這個命令最常被用在 shell script 的撰寫當中, 想要跟使用者對談?用這個命令就對了。關於 script 的寫法,我們會在第十三章介紹,底下先來瞧一瞧 read 的相關語法吧!

[root@www ~]# read [-pt] variable
選項與參數:
-p  :後面可以接提示字符!
-t  :後面可以接等待的『秒數!』這個比較有趣~不會一直等待使用者啦!

范例一:讓用戶由鍵盤輸入一內容,將該內容變成名為 atest 的變量
[root@www ~]# read atest
This is a test        <==此時光標會等待你輸入!請輸入左側文字看看
[root@www ~]# echo $atest
This is a test          <==你剛剛輸入的數據已經變成一個變量內容!

范例二:提示使用者 30 秒內輸入自己的大名,將該輸入字符串作為名為 named 的變量內容
[root@www ~]# read -p "Please keyin your name: " -t 30 named
Please keyin your name: VBird Tsai   <==注意看,會有提示字符喔!
[root@www ~]# echo $named
VBird Tsai        <==輸入的數據又變成一個變量的內容了!

read 之後不加任何參數,直接加上變量名稱,那麼底下就會主動出現一個空白行等待你的輸入(如范例一)。 如果加上 -t 後面接秒數,例如上面的范例二,那麼 30 秒之內沒有任何動作時, 該命令就會自動略過了~如果是加上 -p ,嘿嘿!在輸入的光標前就會有比較多可以用的提示字符給我們參考!

6:數組 (array) 變量類型

數組的配置方式是:

var[index]=content
范例:配置上面提到的 var[1] ~ var[3] 的變量。
[root@www ~]# var[1]="small min"
[root@www ~]# var[2]="big min"
[root@www ~]# var[3]="nice min"
[root@www ~]# echo "${var[1]}, ${var[2]}, ${var[3]}"
small min, big min, nice min

Shell編程淺析 http://www.linuxidc.com/Linux/2014-08/105379.htm

Linux Shell參數替換 http://www.linuxidc.com/Linux/2013-06/85356.htm

Shell for參數 http://www.linuxidc.com/Linux/2013-07/87335.htm

Linux/Unix Shell 參數傳遞到SQL腳本 http://www.linuxidc.com/Linux/2013-03/80568.htm

Shell腳本中參數傳遞方法介紹 http://www.linuxidc.com/Linux/2012-08/69155.htm

Shell腳本傳遞命令行參數 http://www.linuxidc.com/Linux/2012-01/52192.htm

Copyright © Linux教程網 All Rights Reserved