1. 程式人生 > >Shell變數:Shell變數的定義、刪除變數、只讀變數、變數型別

Shell變數:Shell變數的定義、刪除變數、只讀變數、變數型別

變數是任何一種程式語言都必不可少的組成部分,變數用來存放各種資料。指令碼語言在定義變數時通常不需要指明型別,直接賦值就可以,Shell 變數也遵循這個規則。

在 Bash shell 中,每一個變數的值都是字串,無論你給變數賦值時有沒有使用引號,值都會以字串的形式儲存。

這意味著,Bash shell 在預設情況下不會區分變數型別,即使你將整數和小數賦值給變數,它們也會被視為字串,這一點和大部分的程式語言不同。
例如在 C/C++ 中,變數分為整數、小數、字串、布林等多種型別。
當然,如果有必要,你也可以使用 declare 關鍵字顯式定義變數的型別,但在一般情況下沒有這個需求,Shell 開發者在編寫程式碼時自行注意值的型別即可。

定義變數

Shell 支援以下三種定義變數的方式:

variable=value
variable='value'
variable="value"

variable 是變數名,value 是賦給變數的值。如果 value 不包含任何空白符(例如空格、Tab縮排等),那麼可以不使用引號;如果 value 包含了空白符,那麼就必須使用引號包圍起來。使用單引號和使用雙引號也是有區別的,稍後我們會詳細說明。

注意,賦值號的周圍不能有空格,這可能和你熟悉的大部分程式語言都不一樣。

Shell 變數的命名規範和大部分程式語言都一樣:
  • 變數名由數字、字母、下劃線組成;
  • 必須以字母或者下劃線開頭;
  • 不能使用 Shell 裡的關鍵字(通過 help 命令可以檢視保留關鍵字)。

變數定義舉例:
  1. url=http://c.biancheng.net
  2. echo $url
  3. name='C語言中文網'
  4. echo $name
  5. author="嚴長生"
  6. echo $author

使用變數

使用一個定義過的變數,只要在變數名前面加美元符號$即可,如:
  1. author="嚴長生"
  2. echo $author
  3. echo ${author}
變數名外面的花括號{ }是可選的,加不加都行,加花括號是為了幫助直譯器識別變數的邊界,比如下面這種情況:
  1. skill="Java"
  2. echo "I am good at ${skill}Script"
如果不給 skill 變數加花括號,寫成echo "I am good at $skillScript"
,直譯器就會把 $skillScript 當成一個變數(其值為空),程式碼執行結果就不是我們期望的樣子了。

推薦給所有變數加上花括號{ },這是個良好的程式設計習慣。

修改變數的值

已定義的變數,可以被重新賦值,如:
  1. url="http://c.biancheng.net"
  2. echo ${url}
  3. url="http://c.biancheng.net/cpp/shell/"
  4. echo ${url}
第二次對變數賦值時不能在變數名前加$,只有在使用變數時才能加$

單引號和雙引號的區別

前面我們還留下一個疑問,定義變數時,變數的值可以由單引號' '包圍,也可以由雙引號" "包圍,它們到底有什麼區別呢?不妨以下面的程式碼為例來說明:
  1. #!/bin/bash
  2. url="http://c.biancheng.net"
  3. website1='C語言中文網:${url}'
  4. website2="C語言中文網:${url}"
  5. echo $website1
  6. echo $website2
執行結果:
C語言中文網:${url}
C語言中文網:http://c.biancheng.net

以單引號' '包圍變數的值時,單引號裡面是什麼就輸出什麼,即使內容中有變數和命令(命令需要反引起來)也會把它們原樣輸出。這種方式比較適合定義顯示純字串的情況,即不希望解析變數、命令等的場景。

以雙引號" "包圍變數的值時,輸出時會先解析裡面的變數和命令,而不是把雙引號中的變數名和命令原樣輸出。這種方式比較適合字串中附帶有變數和命令並且想將其解析後再輸出的變數定義。

嚴長生的建議:如果變數的內容是數字,那麼可以不加引號;如果真的需要原樣輸出就加單引號;其他沒有特別要求的字串等最好都加上雙引號,定義變數時加雙引號是最常見的使用場景。

將命令的結果賦值給變數

Shell 也支援將命令的執行結果賦值給變數,常見的有以下兩種方式:

variable=`command`
variable=$(command)

第一種方式把命令用反引號包圍起來,反引號和單引號非常相似,容易產生混淆,所以不推薦使用這種方式;第二種方式把命令用$()包圍起來,區分更加明顯,所以推薦使用這種方式。

例如,我在 code 目錄中建立了一個名為 log.txt 的文字檔案,用來記錄我的日常工作。下面的程式碼中,使用 cat 命令將 log.txt 的內容讀取出來,並賦值給一個變數,然後使用 echo 命令輸出。
[[email protected] ~]$ cd code
[[email protected] code]$ log=$(cat log.txt)
[[email protected] code]$ echo $log
[2017-09-10 06:53:22] 嚴長生正在編寫Shell教程
[[email protected] code]$ log=`cat log.txt`
[[email protected] code]$ echo $log
[2017-09-10 06:53:22] 嚴長生正在編寫Shell教程
[[email protected] code]$ 

只讀變數

使用 readonly 命令可以將變數定義為只讀變數,只讀變數的值不能被改變。

下面的例子嘗試更改只讀變數,結果報錯:
  1. #!/bin/bash
  2. myUrl="http://see.xidian.edu.cn/cpp/shell/"
  3. readonly myUrl
  4. myUrl="http://see.xidian.edu.cn/cpp/danpianji/"
執行指令碼,結果如下:
/bin/sh: NAME: This variable is read only.

刪除變數

使用 unset 命令可以刪除變數。語法:
  1. unset variable_name
變數被刪除後不能再次使用;unset 命令不能刪除只讀變數。

舉個例子:
  1. #!/bin/sh
  2. myUrl="http://see.xidian.edu.cn/cpp/u/xitong/"
  3. unset myUrl
  4. echo $myUrl
上面的指令碼沒有任何輸出。

變數型別

執行shell時,會同時存在三種變數:

1) 區域性變數

區域性變數在指令碼或命令中定義,僅在當前shell例項中有效,其他shell啟動的程式不能訪問區域性變數。

2) 環境變數

所有的程式,包括shell啟動的程式,都能訪問環境變數,有些程式需要環境變數來保證其正常執行。必要的時候shell指令碼也可以定義環境變數。

3) shell變數

shell變數是由shell程式設定的特殊變數。shell變數中有一部分是環境變數,有一部分是區域性變數,這些變數保證了shell的正常執行