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

1:環境變量php

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

       such as:[root@hadoopHost ~]#  export 或者env shell

       常見的環境變量有:數組

  • 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

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

      用 set 觀察全部變量 (含環境變量與自定義變量)函數

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

    • 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
相關文章
相關標籤/搜索