Shell變數 變數是任何一種編程語言都必不可少的組成部分,變數用來存放各種數據。腳本語言在定義變數時通常不需要指明類型,直接賦值就可以,Shell 變數也遵循這個規則。 在 Bash shell 中,每一個變數的值都是字元串,無論你給變數賦值時有沒有使用引號,值都會以字元串的形式存儲。 這意味著, ...
Shell變數
變數是任何一種編程語言都必不可少的組成部分,變數用來存放各種數據。腳本語言在定義變數時通常不需要指明類型,直接賦值就可以,Shell 變數也遵循這個規則。
在 Bash shell 中,每一個變數的值都是字元串,無論你給變數賦值時有沒有使用引號,值都會以字元串的形式存儲。
這意味著,Bash shell 在預設情況下不會區分變數類型,即使你將整數和小數賦值給變數,它們也會被視為字元串,這一點和大部分的編程語言不同。例如在C語言或者 C++ 中,變數分為整數、小數、字元串、布爾等多種類型。
當然,如果有必要,你也可以使用 Shell declare 關鍵字顯式定義變數的類型,但在一般情況下沒有這個需求,Shell 開發者在編寫代碼時自行註意值的類型即可。
定義變數
shell支持一下三種定義方式:
variable=value
variable='value'
variable="value"
variable 是變數名,value 是賦給變數的值。如果 value 不包含任何空白符(例如空格、Tab 縮進等),那麼可以不使用引號;如果 value 包含了空白符,那麼就必須使用引號包圍起來。使用單引號和使用雙引號也是有區別的
註意,賦值號=
的周圍不能有空格,這可能和你熟悉的大部分編程語言都不一樣。
Shell變數的命名規範和大部分編程語言都一樣:
- 變數由數字、字母和下劃線組成
- 必須以字母或者下劃線開頭
- 不能使用Shell里的關鍵字(通過help命令可以查看保留關鍵字)
變數定義舉例:
url=https://www.cnblogs.com/liyugui/
echo $url
name='Agui'
echo $name
author="cyyzww"
echo $author
使用變數
使用一個定義過的變數,只要在變數前面加上$
就可以了,例:
name="Agui"
echo $name
echo ${name}
其中{}
是可選的,加不加都可以,主要是為了幫助解釋器識別變數的邊界,例:
skill='Java'
echo "I am good at ${skill}Script"
如果不給skill
加上{}
結果就會變成I am good at $skillScript
,所以在使用時需要多加註意
修改變數的值
已定義的變數,可以被重新賦值,例:
url="https://www.cnblogs.com/liyugui/"
echo $url
url="change"
echo $url
單引號和雙引號的區別
變數賦值的時候可以使用單引號也可以使用雙引號,那麼二者有什麼區別呢?從下麵的代碼中來說明看看:
#!/bin/bash
url="https://www.cnblogs.com/liyugui/"
out1='Agui's blog ${url}'
out2="Agui's blog ${url}"
echo $out1
echo $out2
輸出結果:
Agui's blog ${url}
Agui's blog https://www.cnblogs.com/liyugui/
以單引號''
包圍變數的值時,單引號裡面是什麼就輸出什麼,即使內容中有變數或是命令(命令需要反引起來)也會把它們按照原樣進行輸出。這種方式比較適合顯示純字元串的情況,即不希望解析變數、命令的場景。
以雙引號""
包圍變數的值時,輸出會先解析裡面的變數和命令,而不是把雙引號中的變數名和命令原樣輸出。這種方式比較適合於字元串中附帶有變數和命令並且想要解析後在輸出定義。
平時在對變數進行賦值時,如果是數字,那麼可以不加引號;除非真的需要原樣輸出,否則習慣性的使用雙引號,定義變數使用雙引號是最常見的使用場景
將命令的結果賦值給變數
Shell 也支持將命令的結果賦值給變數,主要有以下兩種方式:
variable=`command`
variable=$(command)
第一種方式把命令用反引號` `
(位於 Esc 鍵的下方)包圍起來,反引號和單引號非常相似,容易產生混淆,所以不推薦使用這種方式;第二種方式把命令用$()包圍起來,區分更加明顯,所以推薦使用這種方式。
只讀變數
使用readonly
命令可以將變數定義為只讀變數,只讀變數的值不能改變,例:
#!/bin/bash
url="https://www.cnblogs.com/liyugui/"
readonly url
url="change"
運行腳本,結果如下:
bash: url: This variable is readonly.
刪除變數
使用unset
可以刪除變數,例:
unset variable
變數被刪除之後無法再次使用,unset
命令不能刪除只讀變數