linux的bash環境變量

一.環境變量簡介

 Linux是一個多用戶的操做系統。每一個用戶登陸系統後,都會有一個專用的運行環境。一般每一個用戶默認的環境都shell

   是相同的,這個默認環境實際上就是一組環境變量的定義。編程

   環境變量是全局的,設置好的環境變量能夠被全部當前用戶所運行的程序所使用。windows

   用戶能夠對本身的運行環境進行定製,其方法就是修改相應的系統環境變量。數組

常見的環境變量:bash

 PATH:             決定了shell將到哪些目錄中尋找命令或程序less

 ROOTPATH:     這個變量的功能和PATH相同,但它只羅列出超級用戶(root)鍵入命令時所需檢查的目錄。編輯器

 HOME:            當前用戶主目錄函數

 USER:               查看當前的用戶加密

 LOGNAME:    查看當前用戶的登陸名。操作系統

  UID:                當前用戶的識別字,取值是由數位構成的字串。

 SHELL:           是指當前用戶用的是哪一種Shell。

 TERM :           終端的類型。

 PWD                 當前工做目錄的絕對路徑名,該變量的取值隨cd命令的使用而變化。

 MAIL:             是指當前用戶的郵件存放目錄。

 HISTSIZE:     是指保存歷史命令記錄的條數

 HOSTNAME: 是指主機的名稱,許多應用程序若是要用到主機名的話,一般是從這個環境變量中來取得的。

  PS1:              是基本提示符,對於root用戶是#,對於普通用戶是$,也可使用一些更復雜的值。

  PS2:              是附屬提示符,默認是「>」。能夠經過修改此環境變量來修改當前的命令符,好比下列命令會將提示符

                            修改爲字符串「Hello,My NewPrompt :) 」。# PS1=" Hello,My NewPrompt :)"

  IFS:               輸入域分隔符。當shell讀取輸入時,用來分隔單詞的一組字符,它們一般是空格、製表符和換行符。

語言及環境字符集相關的重要環境變量:

 相關命令:

     stty 顯示或設定文字終端設置,主要是按鍵的表明意義

     locale (local environment)查看當前的語系信息

     【注:locale -a :查看當前系統所支持的字符集】

 LANG   沒有設置任何LC_XXX變量時所使用的默認值。

    【LANG=zh.CN.UTF-8   gedit a.txt  //臨時採用其它字符集語言打開指定的應用程序】

 LC_ALL  用來覆蓋掉全部其餘LC_XXX變量的值

 LC_COLLATE 使用所指定地區的排序規則

 LC_CTYPE 使用指定地區的字符集(即:字母,數字,標點符號等)

 LC_MESSAGES  使用所指定地區的響應與信息;【注:僅POSIX適用】

 LC_MONETARY 使用指定地區的貨幣格式

 LC_NUMERIC 使用指定地區的數字格式

 LC_TIME  使用指定地區的日期與時間格式。

不太經常使用的實用環境變量:

  LD_LIBRARY_PATH 這個變量包含了一系列用冒號隔開的目錄,動態連接器將在這些目錄裏查找庫文件。
  MANPATH 這個變量包含了一系列用冒號隔開的目錄,命令man會在這些目錄裏搜索man頁面。
【注:man幫助目錄結構必須爲:man/{man1,man2,..man8},MANPATH=/man】
  INFODIR 這個變量包含了一系列用冒號隔開的目錄,命令info將在這些目錄裏搜索info頁面。
  PAGER 這個變量包含了瀏覽文件內容的程序的路徑(例如less或者more)。
  EDITOR 這個變量包含了修改文件內容的程序(文件編輯器)的路徑(好比nano或者vi)。

系統位置變量—【僅用於shell腳本中獲取命令行傳遞給腳本的參數】

   $0、$1 $2 $3 $4 $5 $6 $7 $8 $9,$*  ——>$0到9與windows中0~9的含義同樣。

  $0:當前執行Shell文件名

  $#:命令行中位置參數的個數

  $*:獲取當前shell的全部參數

  $@:此程序的全部參數

系統特殊變量

  $?:上一條命令執行後返回的狀態,當返回值爲0:表執行正常,非0:執行異常或出錯

         程序執行,可能有兩類返回值:

               》0:正確執行

               》1~255:錯誤執行。其中1,2,127是系統預留錯誤代碼,可自行使用 

  $$:當前所在進程的進程號 【$$變量最多見的用途是用作暫存文件的名字以保證暫存文件不會重複。】

  $!:後臺運行的最後一個進程號       

  $_:在此以前執行命令或腳本的最後一個參數

引號對變量賦值的影響:

 》雙引號「」:容許經過$符號引用其餘變量值

 》單引號‘’: 禁止引用其餘變量值,$視爲普通字符 

 》反撇號` `:將命令執行的結果變輸出給變量 ,

                    $(…) :這是反撇號的另外一種版本。

二.Bash(Bourne-AgainShell)簡介

   Bash是許多Linux平臺的內定Shell,事實上,還有許多傳統UNIX上用的Shell,像tcsh、csh、ash、bsh、ksh

等等。ShellScript大體都類同,當您學會一種Shell之後,其它的Shell會很快就上手。

大多數的時候,一個ShellScript一般能夠在不少種Shell上使用。

一般而言,shell的功能是從終端或其它輸入取得命令行,將其解析爲一系列操做指令,調用系統內核或相應的

外部程序執行,而後將執行結果返回給終端或其它輸出。所以,實現一個簡單的shell是一項容易的工做。

但bash的功能不只限於此,它支持用管道和重定向協同執行命令,提供了強大的腳本編程能力,

具有做業管理功能。通常的Linux發行版中,bash的可執行文件每每是/bin中最大的幾個實用程序之一,

客觀反映了它的複雜性。

三.Bash實現原理簡介

    bash使用GNU Readline庫處理用戶命令輸入,Readline提供相似於vi或emacs的行編輯功能。

    bash運行時的調度中心是其主控循環。主控循環的功能較爲簡單,它循環讀取用戶(或腳本)輸入,傳遞給

  語法分析器,同時處理下層遞歸返回的錯誤。

     語法分析器對文本形式的輸入首先進行通配符、別名、算術和變量展開等工做,而後經過命令生成器獲得

  規範的命令結構,並由專門的重定向處理機制填寫重定向語義,交由命令執行器執行。命令執行器依據

  命令種類不一樣,執行內部命令函數、外部程序或文件系統調用。在命令執行過程當中,執行器要對系統信號

  進行捕獲和處理。在支持做業管理的操做系統中,命令執行器將進程信息加入做業控制機制,並容許用戶

  使用內部命令或鍵盤信號來啓停做業。若是在不支持做業管理的操做系統中編譯bash,會使用另外一套接口

  相同的機制對進程信息進行簡單的維護。

四.Shell和環境變量的關係

     環境變量是和Shell緊密相關的,環境變量是經過Shell命令來設置的。用戶登陸系統後就啓動了一個Shell。

  對於Linux來講通常是bash,但也能夠從新設定或切換到其它的 Shell。

     設置好的環境變量又能夠被全部當前用戶所運行的程序所使用。對於bash這個Shell程序來講,能夠經過

 

  變量名來訪問相應的環境變量。

    Linux 的環境變量具備繼承性,即子shell會繼承父shell 的環境變量。

     當前shell中的變量也叫本地變量,很顯然本地變量中確定包含環境變量。Linux 的本地變量的非環境變量

  不具有繼承性。

5、登陸腳本的執行順序:【注:僅適用於 bash shell】

LoginShell

   是指登陸時,須要提供用戶名密碼的shell,如:su – user1 , 圖形登陸, ctrl+alt+F2-6進入的登陸界面。

 這種Login shell  執行腳本的順序:

   1./etc/profile       【全局profile文件;它定義了LoginUser的 PATH, USER, LOGNAME(登陸使用者賬號)】

   2./etc/profile.d/目錄下的腳本

   3.~/.bash_profile   【搜索命令的路徑    ——————- 登陸級別 環境變量配置文件 】

   4.~/.bashrc      【存儲用戶設定的別名和函數———- shell級別 環境變量配置文件】

   5./etc/bashrc     【全局bashrc文件; 它主要定義一些 Function 和 Alias;更改/etc/bashrc會影響到全部用戶,由root用戶管理。】

Non-Loginshell

   非登陸shell指的是,不須要輸入用戶名密碼的shell,如圖形下 右鍵terminal,或ctrl+shift+T打開的shell

 這種Non-Login shell 執行登陸腳本的順序:

   1.~/.bashrc

   2./etc/bashrc

   3./etc/profile.d/目錄下的腳本

說到用戶腳本就不能不說下,與用戶密切相關的兩個文件:

  1./etc/login.defs   —– 它定義了用戶密碼長度,最長使用期,警告天數,密碼加密方法,家目錄默認權限等。

  2./etc/default/useradd  –它定義了建立用戶時,默認家目錄的根,默認shell,從哪裏拷貝必要配置文件,是否建立郵箱等。

      /etc/skel –【.bashrc,.bash_profile, .bash_logout等文件都源自這裏】

           當用命令添加一個用戶時,它默認會在/home/下新建一個以用戶名爲名的目錄,並把/etc/skel下的文件

          copy到這個新用戶的家目錄中。這樣當該用戶登陸時,系統會自動調用這些文件,配置該用戶的登陸環境。

六. 環境變量的應用和 操做:

1.變量內容的刪除和替換

     ${變量#關鍵詞} 從頭開始檢查關鍵詞,將符合的最短數據刪除

     ${變量##關鍵詞} 從頭開始檢查關鍵詞,將符合的最長數據刪除

     ${變量%關鍵詞} 從尾開始檢查關鍵詞,將符合的最短數據刪除

     ${變量%%關鍵詞} 從尾開始檢查關鍵詞,將符合的最長數據刪除

     ${變量/舊字符串/新字符串} 若符合舊字符串,則第一個舊字符串被替換

     ${變量//舊字符串/新字符串} 若符合舊字符串,則所有舊字符串被替換

2. 變量內容的設定和替換

     一次變量置換:

        變量沒有值:

              echo ${a:=abc}   //若a沒有值,就送給a一個abc,做爲它的值,這時a的值就永久是abc了,直到下次修改。

            //下面例子不經常使用

              echo ${a:?必須須要給變量一個值}   //若a沒有值,則提示"必須須要給變量一個值"

              echo ${a:-abc}   //若a沒有值,就借給a一個值,次命令執行完後,a仍是空值。

        變量有值

              echo  ${a:+123} //臨時替換變量的值; a=1;expr ${a:+123} – 1;其值爲122

   二次變量置換

       示例一:

              A=B

              a=1

              B1="B值"

             eval echo \$$A$a >B1.txt   //注意:這裏不能直接用反撇號獲取二次置換的結果。

              C=`cat B1.txt`      //如此就能夠獲取B1的變量值了.

 

      示例二:

              FAIL="echo -e\"\n\e[31m\${FMSG}\e[0m\n\""

              FMSG="須要紅色提示顯示的字符串。"  && eval ${FAIL}

 

     示例三:

             grep的結果:"APPDIR="/home/abc/bin「"  經過eval能夠直接將APPDIR轉換爲賦值語句執行。

              eval `grep '^ .*APPDIR'  /etc/tuxconfig`

              echo ${APPDIR}      //這樣就能夠輸出APPDIR的值。

七.一些Shell內置命令

1.source命令

     做用:在當前bash環境下讀取並執行FileName中的命令,使環境變量生效。

     注:該命令一般用命令「.」來替代。

     例如:

          source ~/.bash_profile

2.export :

     用於把變量變成當前shell和其子shell的環境變量,存活期是當前的shell及其子shell,所以從新登錄或者關閉當前

   shell及其子shell後,它所設定的環境變量就消失了。

3.env和printenv

     這兩個變量用於打印全部的環境 變量:

4.set

     用於顯示與設置當前本地 變量。單獨一個set 就顯示了當前環境的全部的變量,它確定包括環境變量和一些非環境變量

5.unset
用於清除變量。無論這個變量是環境變量仍是本地變量,它均可以清除。

八.其它與變量相關的小知識

   

shell : 屬於弱類型語言,變量可直接使用,不須要聲明和初始化。

     對於強類型語言,則必須在使用變量前先聲明,甚至須要初始化,由於變量不初始化其值爲隨機數。

    

變量: 它是內存空間的一個別名,這個別名映射的是內存的存儲單元的編址。

    

數組:是一個命名的連續的內存空間

    Shell的變量類型: 是事先肯定數據的存儲格式和長度。

 

字符:  是按照ASCII存儲;一個字符串10,是存儲爲兩個ASCII碼,佔16bit。

              

數值:  

      1.整型:    如10,它存儲時,是轉爲二進制1010,佔4bit,實際佔8bit.

      2.浮點型: 「11.23」,它在存儲時,是會轉爲兩部分存放,

       通常爲數值和小數點位置,如11.23–>0.1123*10^2,存儲時僅存1123和次方數2.

       如:2014/11/11在存放時,它是若按字符串存64bit.

       如按數值存則採用2014/11/11– 1977/1/1 =N, 它若存N這個數值,須要的空間最多24bit.  

變量溢出:

     一個整型是8bit,可存放的值有256個,範圍是0-255,但若一個整型中存放了256,最怎樣?結果就是變量溢出,

    8bit中存的是全0,1溢出了,溢出以後1被存放到其它程序的存儲空間中了,它可能覆蓋其它程序的數據。

     這看上去沒有任何意義,但如果一個設計精良的溢出值,則可能會所以覆蓋掉某些程序的一部份內存空間

     從而輕易的獲取該程序的控制權,若該程序是系統進程,則它將可能獲取系統權限

 shell中數組相關操做: —【注:shell中的數組不能作爲export導出的對象,所以它僅不能做爲環境變量】

       

變量名=(Value1  Value2 Value3  Value4)

       a=(1  2  3 4  5)

           

例子:

       Cpu(s):  1.0%us,  0.5%sy, 0.0%ni, 98.5%id,  0.0%wa,  0.0%hi, 0.0%si,  0.0%st

        a=(`top -n5 -d1 | awk '$1~/Cpu\(s\):/{print $2}' | awk -F'%' '{print$1}' | xargs -n5`)

       

查數組成員數:

        echo  ${#a[*]}  —>前面加「#」,表示查看數組有多少個成員

       

查當作員值:

                echo ${a[0]}  —>第一個數組成員的值爲  1.

               echo ${a[*]}  或  echo ${a[@]}   —>查看因此成員的值

                declare  -p a  —>查看全部數組成員。

                echo  ${a[*]:1:3} —>查看數組中下標爲1~3的成員值