變量是任何一種編程語言都必不可少的組成部分,變量用來存放各種數據。腳本語言在定義變量時通常不需要指明類型,直接賦值就可以,Shell 變量也遵循這個規則
在 Bash shell 中,每一個變量的值都是字符串,無論你給變量賦值時有沒有使用引號,值都會以字符串的形式存儲。
當然,如果有必要,你也可以使用 Shell declare關鍵字顯式定義變量的類型,但在一般情況下沒有這個需求,Shell 開發者在編寫代碼時自行注意值的類型即可。
一、變量定義
Shell 支持以下三種定義變量的方式:
variable=value
variable='value'
variable="value"
variable 是變量名,value 是賦給變量的值。如果 value 不包含任何空白符(例如空格、Tab 縮進等),那么可以不使用引號;如果 value 包含了空白符,那么就必須使用引號包圍起來。使用單引號和使用雙引號也是有區別的,稍后我們會詳細說明。
注意,賦值號
=
的周圍不能有空格
Shell 變量的命名規范和大部分編程語言都一樣:
- 變量名由數字、字母、下劃線組成;
- 必須以字母或者下劃線開頭;
- 不能使用 Shell 里的關鍵字(通過 help 命令可以查看保留關鍵字)。
已定義的變量,可以被重新賦值
二、使用變量
使用一個定義過的變量,只要在變量名前面加美元符號$
即可
author="lizhengi"
echo $author
echo ${author}
變量名外面的花括號{ }
是可選的,加不加都行,加花括號是為了幫助解釋器識別變量的邊界,比如下面這種情況:
skill="Java"echo "I am good at ${skill}Script"
如果不給 skill 變量加花括號,寫成echo "I am good at $skillScript"
,解釋器就會把 $skillScript 當成一個變量(其值為空),代碼執行結果就不是我們期望的樣子了。
推薦給所有變量加上花括號
{ }
,這是個良好的編程習慣。
- 使用 readonly 命令可以將變量定義為只讀變量,只讀變量的值不能被改變
- 使用 unset 命令可以刪除變量
三、單引號和雙引號的區別
以單引號' '
包圍變量的值時,單引號里面是什么就輸出什么,即使內容中有變量和命令(命令需要反引起來)也會把它們原樣輸出。這種方式比較適合定義顯示純字符串的情況,即不希望解析變量、命令等的場景。
以雙引號" "
包圍變量的值時,輸出時會先解析里面的變量和命令,而不是把雙引號中的變量名和命令原樣輸出。這種方式比較適合字符串中附帶有變量和命令并且想將其解析后再輸出的變量定義。
如果變量的內容是數字,那么可以不加引號;如果真的需要原樣輸出就加單引號;其他沒有特別要求的字符串等最好都加上雙引號,定義變量時加雙引號是最常見的使用場景。
四、系統變量
4.1、常用系統變量
HOME家目錄、HOME家目錄、HOME家目錄、PWD當前目錄、SHELL默認解釋器、SHELL默認解釋器、SHELL默認解釋器、USER當前用戶等
4.2、顯示當前Shell中所有變量:set
五、特殊變量
$#: 命令行參數的個數
$n : 當前程序的第n個參數,n=1,2,…,9
$0: 當前程序的名稱
$?: 執行上一個指令或函數的返回值
$*: 以”參數1,參數2…..”形式保存所有參數
$@: 以”參數1”,”參數2”…..”形式保存所有參數
$$ : 本程序的PID(ProcessID)
$! : 上一個命令的PID
$- : 顯示shell使用的當前選項,與set命令功能相同