Shell變數:Shell變數的定義、刪除變數、只讀變數、變數型別
阿新 • • 發佈:2019-01-08
變數是任何一種程式語言都必不可少的組成部分,變數用來存放各種資料。指令碼語言在定義變數時通常不需要指明型別,直接賦值就可以,Shell 變數也遵循這個規則。
在 Bash shell 中,每一個變數的值都是字串,無論你給變數賦值時有沒有使用引號,值都會以字串的形式儲存。
這意味著,Bash shell 在預設情況下不會區分變數型別,即使你將整數和小數賦值給變數,它們也會被視為字串,這一點和大部分的程式語言不同。
注意,賦值號的周圍不能有空格,這可能和你熟悉的大部分程式語言都不一樣。
Shell 變數的命名規範和大部分程式語言都一樣:
變數定義舉例: ,直譯器就會把 $skillScript 當成一個變數(其值為空),程式碼執行結果就不是我們期望的樣子了。
推薦給所有變數加上花括號
C語言中文網:${url}
C語言中文網:http://c.biancheng.net
以單引號
以雙引號" "包圍變數的值時,輸出時會先解析裡面的變數和命令,而不是把雙引號中的變數名和命令原樣輸出。這種方式比較適合字串中附帶有變數和命令並且想將其解析後再輸出的變數定義。
嚴長生的建議:如果變數的內容是數字,那麼可以不加引號;如果真的需要原樣輸出就加單引號;其他沒有特別要求的字串等最好都加上雙引號,定義變數時加雙引號是最常見的使用場景。
例如,我在 code 目錄中建立了一個名為 log.txt 的文字檔案,用來記錄我的日常工作。下面的程式碼中,使用 cat 命令將 log.txt 的內容讀取出來,並賦值給一個變數,然後使用 echo 命令輸出。
下面的例子嘗試更改只讀變數,結果報錯:
舉個例子:
在 Bash shell 中,每一個變數的值都是字串,無論你給變數賦值時有沒有使用引號,值都會以字串的形式儲存。
這意味著,Bash shell 在預設情況下不會區分變數型別,即使你將整數和小數賦值給變數,它們也會被視為字串,這一點和大部分的程式語言不同。
例如在 C/C++ 中,變數分為整數、小數、字串、布林等多種型別。當然,如果有必要,你也可以使用 declare 關鍵字顯式定義變數的型別,但在一般情況下沒有這個需求,Shell 開發者在編寫程式碼時自行注意值的型別即可。
定義變數
Shell 支援以下三種定義變數的方式:
variable=value
variable='value'
variable="value"
注意,賦值號的周圍不能有空格,這可能和你熟悉的大部分程式語言都不一樣。
Shell 變數的命名規範和大部分程式語言都一樣:
- 變數名由數字、字母、下劃線組成;
- 必須以字母或者下劃線開頭;
- 不能使用 Shell 裡的關鍵字(通過 help 命令可以檢視保留關鍵字)。
變數定義舉例:
- url=http://c.biancheng.net
- echo $url
- name='C語言中文網'
- echo $name
- author="嚴長生"
- echo $author
使用變數
使用一個定義過的變數,只要在變數名前面加美元符號$
即可,如:
- author="嚴長生"
- echo $author
- echo ${author}
{
}
是可選的,加不加都行,加花括號是為了幫助直譯器識別變數的邊界,比如下面這種情況:
- skill="Java"
- echo "I am good at ${skill}Script"
echo
"I am good at $skillScript"
推薦給所有變數加上花括號
{
}
,這是個良好的程式設計習慣。
修改變數的值
已定義的變數,可以被重新賦值,如:- url="http://c.biancheng.net"
- echo ${url}
- url="http://c.biancheng.net/cpp/shell/"
- echo ${url}
$
,只有在使用變數時才能加$
。
單引號和雙引號的區別
前面我們還留下一個疑問,定義變數時,變數的值可以由單引號' '包圍,也可以由雙引號" "包圍,它們到底有什麼區別呢?不妨以下面的程式碼為例來說明:- #!/bin/bash
- url="http://c.biancheng.net"
- website1='C語言中文網:${url}'
- website2="C語言中文網:${url}"
- echo $website1
- 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 命令可以將變數定義為只讀變數,只讀變數的值不能被改變。下面的例子嘗試更改只讀變數,結果報錯:
- #!/bin/bash
- myUrl="http://see.xidian.edu.cn/cpp/shell/"
- readonly myUrl
- myUrl="http://see.xidian.edu.cn/cpp/danpianji/"
/bin/sh: NAME: This variable is read only.
刪除變數
使用 unset 命令可以刪除變數。語法:- unset variable_name
舉個例子:
- #!/bin/sh
- myUrl="http://see.xidian.edu.cn/cpp/u/xitong/"
- unset myUrl
- echo $myUrl