1.什么是變量
??變量在許多程序設計語言中都有定義,與變量相伴地有使用范圍地定義。Linux Shell也不例外。變量,本質上就是一個鍵值對。例如:
str=“hello”
??就是將字符串值“hello”賦予鍵str。在str地使用范圍內,我們都可以用str來引用“hello”值,這個操作叫做變量替換。
2.Linux Shell中的變量
??Shell變量的名稱以一個字母或下劃線符號開始,后面可以接任意長度的字母、數字或下劃線。和許多其它程序設計語言不同的是,Shell變量名稱字符并沒有長度限制。Linux Shell并不對變量區分類型。一切值都是字符串,并且和變量名一樣,值并沒有字符長度限制。神奇的是,bash也允許比較操作和整數操作,其中關鍵因素是,變量中的字符串值是否為數字。
例1:
#! /bin/sh
long_str="Linux_Shell_programming"
echo $long_str
??例2:
#! /bin/sh
add_1=100
add_2=200
echo $((add_1+add_2))
??由例1和例2的輸出“Linux_Shell_programming”和“300”可見,雖然Linux Shell中的變量都是字符串類型的,但是同樣可以執行比較操作和整數操作,,只要變量字符串值是數字。
變量賦值的方式為:變量名稱=值,其中“=”兩邊不要有任何空格。當你想使用變量名稱來獲得值時,在名稱前加上$。例如:$long_str。
當變量裸體出現的時候(沒有$前綴的時候),變量可能存在如下幾種情況:
- 變量被聲明或被復制
- 變量被unset
- 變量被export
??被一對雙引號(“”)括起來的變量替換是不會被阻止的。所以雙引號被稱為部分引用,有時又被稱為“弱引用”。但是如果使用單引號的話(‘’),那么變量替換就會被禁止了,變量名只會被解釋成字面的意思,不會發生變量替換。所以單引號被稱為“全引用”,有時候也被稱為“強引用”,例如:
#! /bin/sh
var=123
echo '$var'
echo "$var"
??在這個例子中,單引號中的$var沒有替換成變量值123,也就是說,變量替換被禁止了;而雙引號中的$var發生了變量替換。
在Shell的世界里,變量值可以是空值(“NULL” 值),就是不包含任何字符。這種情況很常見,并且也是合理的。但是在算術操作中,這個未初始化的變量常常看起來是0。但是這是一個未文檔化(并且可能是不可移植)的行為。
#! /bin/sh
echo "$uninit" ## 沒有輸出let "uninit += 5"
echo "$uninit" ##輸出為5
3.全局變量和局部變量
??顧名思義,局部變量的可見范圍是代碼塊或函數中,這一點與大部分編程語言是相同的。但是,局部變量必須明確以local生命,否則即使在代碼塊中,它也是全局可見的。
環境變量是全局變量的一種,全局變量在全局范圍內可見,在聲明全局變量時,不需要加任何修飾詞。
下面看一下這個例子:
#! /bin/sh
num=123func1()
{
num=321
echo $num
}func2()
{
local num=456
echo $num
}echo $num
func1
echo $num
func2
echo $num
??這個程序的輸出結果為:
123 ##初始值
321 ##func1內被改變
321 ##func1內的賦值影響到函數體外
456 ##func2內聲明局部變量
321 ##函數體外的num未改變
- 我們設置了一個變量num,初始值賦值為123
- 調用func1,func1中的賦值命令num=321將num=123覆蓋。注意,此處雖然位于函數體內,但是還是能夠修改全局變量,此處的num變量就是全局環境中的num
- 調用func2,func2中定義了局部變量num,并且賦值456,在func2內部,num變量的值為456,此時為局部的;當func2返回后,回到全局作用區,此時num的值并未改變,為321
4.用echo輸出變量
??echo命令的任務就是輸出一行文本,多用于提示用戶或產生數據,我們將在echo的manpage中顯示更多選項。
語法:
echo [OPTION] … [STRING] …
描述:
允許在標準輸出上顯示STRING
主要選項:
-n 不輸出行尾的換行符
行為模式:
echo將各個參數打印到標準輸出,參數間以一個空格隔開,在輸出結束后,換行,它會解釋每個字符串里的轉義序列,轉義序列可以用來表示特殊字符,以及控制其行為模式
警告:
echo命令的-n選項并不被所有Linux版本支持,POSIX標準中并未包含此選項
??轉義字符可以表示程序中難以看得見或者難以食醋胡的特殊字符,當echo遇到轉義序列時,就會打印相應的字符,echo支持的轉義字符如下表:
序列 | 描述 |
---|---|
\a | 報警符,ACSII的BEL字符 |
\b | 退格符 |
\c | 禁止尾隨,這個字符后面的所有字符 |
\f | 換頁符 |
\n | 換行符 |
\r | 回車符 |
\t | 水平制表符 |
\v | 垂直制表符 |
\ | 反斜線 |
5.環境變量的相關操作
??在通常情況下,每個進程都有自己的“環境”,這個環境是由一組變量組成的,這些變量中存有進程可能需要引用的信息。在這種情況下,Shell與一般的進程沒什么區別。
每次當一個Shell啟動時,它都將創建適合于自己環境變量的Shell變量,更新或者添加一個新的環境變量的話,這個Shell都會立刻更新它自己的環境(換句話說,更改或添加的變量會立即生效),并且所有后繼生成的Shell子進程(即這個Shell所執行的命令)都會繼承這個環境
如果一個腳本要設置一個環境變量,那么需要將這些變量“export”出來,也就是需要同之到腳本本地的環境,這是export命令的功能。
一個腳本只能夠export變量到這個腳本所產生的子進程,也就說只能夠對這個腳本所產生的命令和進程起作用。如果腳本是從命令行中調用的,那么這個腳本所export的變量是不能影響命令行環境的。也就是說,子進程不能夠export變量來影響產生自己的父進程的環境的。但是,當使用source命令執行腳本時,因為沒有子進程的產生,此時腳本中的export命令將會影響父進程的環境。
語法:
export [-fnp][變量名稱=變量設置值]
描述:
export命令用于設置或顯示環境變量
主要選項:
-f 代表[變量名稱]中的函數名稱
-n 刪除指定的變量,變量實際上并未刪除,只是不會輸出到后續指令的執行環境中
-p 列出所有的Shell賦予程序的環境變量
行為模式:
export命令修改當前Shell進程的環境變量,若將export命令置于腳本中被調用執行,則export命令對父Shell進程的環境變量沒有影響
警告:
Shell中執行程序時,Shell會提供一組環境變量。export可新增,修改或刪除環境變量,供后續執行的程序使用。export的效力僅及于該此登錄操作
??export命令用于設置當前進程的環境變量,但是有效期僅維持到當前進程消亡位置。下次重新登陸到命令行shell時,以前對Shell的export設置都無法恢復。如果想要把對環境變量的設置永久保存,則可以將export命令置于Shell登錄時執行的啟動文件中
啟動文件包含別名和環境變量,正是這些別名和環境變量才使得Shell可以作為一個用戶Shell來運行,當系統初始化之后,這些別名和變量也可被其他的Shell腳本調用。
啟動文件/登出文件 | 描述 |
---|---|
/etc/profile | 系統范圍的默認值,大部分用來設置環境(所有的sh衍生出的Shell適用) |
/etc/bashrc | 特定于bash的,系統范圍的函數與別名 |
$HOME/.bash_profile | 用戶定義的,環境默認設置,在每個用戶的home目錄下都可找到(本地副本保存在/etc/profile) |
$HOME/.bashrc | 用戶定義的bash初始化文件,可以在每個用戶的home目錄下找到(本地副本保存在/etc/profile)。只有交互式的Shell和用戶腳本才會讀取這個文件。 |
$HOME/.bash_logout | 登出文件,用戶定義的指令文件,在每個用戶的home目錄下找到。在登出(bash)Shell的時候,這個文件中的命令就會得到執行 |
??注意,此處 $HOME為環境變量, $HOME變量的值是登錄者的用戶目錄,$HOME目錄下存放有許多用戶個人相關的文件和數據,還有對用戶定制的配置文件。這些配置文件往往以“.”開頭。
6.環境變量的env命令
??export命令設置適用于當前Shell的環境變量值,修改后維持不變,直到當前Shell消亡。env命令則可以臨時改變環境變量值
“-i”選項使Shell在執行echo.s時,清空所有由父Shell繼承來的環境變量,僅僅設置命令中指定的PATH變量(將“./”也添加到命令搜尋路徑里)。這樣,在執行echo.sh時,就不需要給出完全路徑(./echo.sh),直接給出命令文件名,系統就知道在哪里找該命令了。
語法:
env [OPTION] … [-] [NAME=VALUE] … [COMMAND [ARG]…]
描述:
在重建的環境中運行程序,設置環境中的每個NAME為VALUE,并且允許COMMAND。
主要選項:
-i,–ignore-environment
不帶環境變量啟動
-u,-unset=NAME
從環境變量中刪除一個變量
行為模式:
未提供COMMAND時,顯示環境中所有變量的名稱和值。提供COMMAND時,根據參數重建環境變量后,在新的環境中允許COMMAND
??Env函數和set函數不同,Envv函數顯示的時環境變量,而set函數則顯示所有的本地變量,包括利用用戶的環境變量。例如,當用戶在命令行中設置var=123時,set函數將顯示var變量,而env函數則不顯示(var此時是本地變量,不是環境變量)。如果使用export var=123命令,則set命令和env命令都可以顯示var變量。
7.環境變量的unset命令
??unset命令從當前shell刪除函數或變量,刪除變量時,使用“-v”選項,刪除函數時,使用“-f”選項。
語法:
unset [-v] variable…
unset -f function…
描述:
從當前Shell刪除變量或函數
主要選項:
-f
刪除指定的函數
-v
刪除指定的變量。在沒有提供任何選項的情況下,默認此選項
行為模式:如果沒有提供任何選項,則默認unset為刪除變量(-v選項)。如果使用-f選項,則被視為刪除函數操作,參數為函數名稱。
8.Shell中一些常用的環境變量
??Linux是一個多用戶的操作系統,每個用戶登錄系統后,都會有一個專用的運行環境。通常用戶默認的環境都是相同的,這個默認環境實際上就是一組環境變量的定義。用戶可以對自己的運行環境進行定制,其方法就是修改相應的系統環境變量。
變量名 | 描述 |
---|---|
HOME | 用戶的專屬目錄,在linux中用“~”擴展 |
PATH | 外部命令的搜索路徑 |
HISTSIZE | 保存歷史命令記錄的條數 |
LOGNAME | 當前用戶的登錄名 |
LOGNAME | 當前用戶的登錄名 |
HOSTNAME | 是指主機的名稱,許多應用程序如果要用到主機名的話,通常是從這個環境變量中來取得 |
SHELL | 當前用戶使用的shell類型 |
LANG/LANGUAGE | 語言相關的環境變量,使用多種語言的用戶可以修改此環境變量 |
當前用戶的郵件存放目錄 | |
PS1/PS2 | PS1是基本提示符,對于root用戶是"#“,對于普通用戶是是”$“。PS2是專屬提示符,默認是”>"。可以通過修改此環境變量來修改當前的命令符 |