linux bash環境變量簡單總結

轉:http://www.178linux.com/?p=8005&preview=true

參考:

http://blog.sina.com.cn/s/blog_5420e00001017z66.html

http://www.cnblogs.com/napoleon_liu/archive/2011/04/01/2001886.html

http://www.cnblogs.com/growup/archive/2011/07/02/2096142.html 


一.環境變量簡介
Linux是一個多用戶的操作系統。每個用戶登錄系統後,都會有一個專用的運行環境。通常每個用戶默認的環境都
 是相同的,這個默認環境實際上就是一組環境變量的定義。
 環境變量是全局的,設置好的環境變量可以被所有當前用戶所運行的程序所使用。
 用戶可以對自己的運行環境進行定製,其方法就是修改相應的系統環境變量。
 常見的環境變量:
PATH:             決定了shell將到哪些目錄中尋找命令或程序
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-Again Shell)簡介
     Bash是許多Linux平臺的內定Shell,事實上,還有許多傳統UNIX上用的Shell,像tcsh、csh、ash、bsh、ksh
  等等。Shell Script大致都類同,當您學會一種Shell以後,其它的Shell會很快就上手。
  大多數的時候,一個Shell Script通常可以在很多種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 的本地變量的非環境變量
  不具備繼承性。


五、登錄腳本的執行順序:【注:僅適用於 bash shell】
  Login Shell
       是指登錄時,需要提供用戶名密碼的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-Login shell
       非登錄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的成員值

 

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章