本文是Linux Shell系列教程的第(三)篇,更多shell教程請看:Linux Shell系列教程 Shell作為一種高級的腳本類語言,也是支持自定義變數的。今天就為大家介紹下Shell中的變數相關知識。 為使Shell編程更有效,系統提供了一些Shell變數。Shell變數可以保存諸如路徑名 ...
本文是Linux Shell系列教程的第(三)篇,更多shell教程請看:Linux Shell系列教程
Shell作為一種高級的腳本類語言,也是支持自定義變數的。今天就為大家介紹下Shell中的變數相關知識。
為使Shell編程更有效,系統提供了一些Shell變數。Shell變數可以保存諸如路徑名、文件名或者一個數字這樣的變數名。
Shell將其中任何設置都看做文本字元串。有兩種變數,本地和環境。嚴格地說可以有 4種,但其餘兩種是只讀的,可以認為是特殊變數,它用於向Shell腳本傳遞參數。
定義變數
定義變數時,變數名不加美元符號($),如:
variableName="value"
註意,變數名和等號之間不能有空格,這可能和你熟悉的所有編程語言都不一樣。同時,變數名的命名須遵循如下規則:
- 首個字元必須為字母(a-z,A-Z)。
- 中間不能有空格,可以使用下劃線(_)。
- 不能使用標點符號。
- 不能使用bash里的關鍵字(可用help命令查看保留關鍵字)。
變數定義舉例:
myUrl=http://www.linuxdaxue.com
myNum=100
使用變數
使用一個定義過的變數,只要在變數名前面加美元符號($)即可,如:
your_name="linuxdaxue" echo $your_name echo ${your_name}
變數名外面的花括弧是可選的,加不加都行,加花括弧是為了幫助解釋器識別變數的邊界,比如下麵這種情況:
for skill in Ada Coffe Action Java do echo "I am good at ${skill}Script" done
如果不給skill變數加花括弧,寫成echo “I am good at $skillScript”,解釋器就會把$skillScript當成一個變數(其值為空),代碼執行結果就不是我們期望的樣子了。
推薦給所有變數加上花括弧,這是個好的編程習慣。
重新定義變數
已定義的變數,可以被重新定義,如:
myUrl="http://www.linuxdaxue.com" echo ${myUrl} myUrl="http://www.linuxdaxue.com" echo ${myUrl}
這樣寫是合法的,但註意,第二次賦值的時候不能寫 $myUrl=”http://www.linuxdaxue.com“,使用變數的時候才加美元符($)。
只讀變數
使用 readonly 命令可以將變數定義為只讀變數,只讀變數的值不能被改變。
下麵的例子嘗試更改只讀變數,結果報錯:
#!/bin/bash myUrl="http://www.linuxdaxue.com" readonly myUrl myUrl="http://www.linuxdaxue.com"
運行腳本,結果如下:
/bin/sh: NAME: This variable is read only.
刪除變數
使用 unset 命令可以刪除變數。語法:
unset variable_name
變數被刪除後不能再次使用;unset 命令不能刪除只讀變數。
舉個例子:
#!/bin/sh myUrl="http://www.linuxdaxue.com" unset myUrl echo $myUrl
上面的腳本沒有任何輸出。
顯示所有本地shell變數
使用set命令顯示所有本地定義的Shell變數。
變數類型
運行shell時,會同時存在三種變數:
1) 局部變數
局部變數在腳本或命令中定義,僅在當前shell實例中有效,其他shell啟動的程式不能訪問局部變數。
2) 環境變數
所有的程式,包括shell啟動的程式,都能訪問環境變數,有些程式需要環境變數來保證其正常運行。必要的時候shell腳本也可以定義環境變數。
3) shell特殊變數
shell變數是由shell程式設置的特殊變數。shell變數中有一部分是環境變數,有一部分是局部變數,這些變數保證了shell的正常運行。下麵就介紹下shell中的特殊變數。
Shell特殊變數
Shell 中的特殊變數主要有以下幾個:
$0, $#, $*, $@, $?, $$
下麵會分別介紹下這幾個變數和含義和使用方法。
名稱 | 含義 |
$0 | 當前腳本的文件名 |
$# | 傳遞給腳本或函數的參數個數。 |
$* | 傳遞給腳本或函數的所有參數。 |
$@ | 傳遞給腳本或函數的所有參數。被雙引號(” “)包含時,與 $* 稍有不同,下麵將會單獨講到。 |
$? | 上個命令的退出狀態,或函數的返回值。 |
$$ | 當前進程的ID。對於 Shell 腳本,就是這些腳本所在的進程ID |
$n | 傳遞給腳本或函數的參數。n 是一個數字,表示第幾個參數。例如,第一個參數是$1,第二個參數是$2 |
命令行參數
運行腳本時傳遞給腳本的參數稱為命令行參數。命令行參數用 $n 表示,例如,$1 表示第一個參數,$2 表示第二個參數,依次類推。
而$0代表當前腳本的文件名。
通過下麵的例子看下這幾個參數的區別:
#!/bin/bash echo "文件名: $0" echo "第一個參數 : $1" echo "第二個參數 : $2" echo "所有參數: $@" echo "所有參數: $*" echo "參數個數: $#"
通過
./test.sh LinuxDaxue .com 執行
執行結果:
文件名:./test.sh 第一個參數:LinuxDaxue 第二個參數:.com 所有參數:LinuxDaxue.com 所有參數:LinuxDaxue.com 參數個數:2
$* 和 $@ 的區別
$* 和 $@ 都表示傳遞給函數或腳本的所有參數,不被雙引號(” “)包含時,都以”$1” “$2” … “$n” 的形式輸出所有參數。
但是當它們被雙引號(” “)包含時,”$*” 會將所有的參數作為一個整體,以”$1 $2 … $n”的形式輸出所有參數;”$@” 會將各個參數分開,以”$1″ “$2” … “$n” 的形式輸出所有參數。
$?獲取退出狀態
$? 可以獲取上一個命令的退出狀態。
所謂退出狀態,就是上一個命令執行後的返回結果。
退出狀態是一個數字,一般情況下,大部分命令執行成功會返回 0,失敗返回 1。
不過,也有一些命令返回其他值,表示不同類型的錯誤。
更多shell教程請看:Linux Shell系列教程
本文固定鏈接:linux大學網--Linux Shell系列教程之(三)Shell變數