我們一起學shell之三:shell變數講解
今天我們來學習shell變數相關的內容。
在實際工作中,無論linux下還是windows下,變數都是實時使用並且相關的。
在linux伺服器下,我們檢視環境變數或系統變數使用的常用命令:
env或set
env顯示使用者環境變數,set顯示Shell預先定義好的變數以及使用者變數。
env
或
set
3.1. 來,我們來列舉幾個shell中常用的系統變數相關內容
$SHELL | 本伺服器的預設Shell |
---|---|
$HOME | 當前使用者的home目錄 |
$LANG | 伺服器預設語言 |
$PATH | 預設程式可執行程式路徑 |
$PWD | 當前目錄 |
$UID | 當前使用者ID |
$USER | 當前使用者 |
$RANDOM | 隨機生成一個0至32767的整數(為什麼是這個段位的呢?) |
$HOSTNAME | 主機名 |
我們來分別檢視,檢視命令形式:echo + 變數。全部執行一遍檢視結果,不要手懶!
由於$RANDOM是生成隨機數的變數,我多輸入了幾次,大家可以看到,輸出了3個不同的數字。
3.2 普通變數(common variables)與臨時環境變數(Temporary Variable)的區別
普通變數定義:VAR=value
臨時環境變數定義:export VAR=value
變數引用:$VAR
下面看下他們之間區別:
Shell程序的環境變數作用域是Shell程序,也就是當前的shell指令碼執行的環境內。當export匯入到系統變數時,則作用域是Shell程序及其Shell子程序。
ps axjf輸出的第一列是PPID(父程序ID),第二列是PID(子程序ID)
我們來執行下命令看下結果。
所以在當前shell定義的變數一定要export,否則在寫指令碼時,會引用不到。
還需要注意的是退出終端後,所有使用者定義的變數都會清除。
3.3位置變數
位置變數也被稱之為位置引數(positional parameters),指的是函式或指令碼後跟的第n個引數。
$1-$n:$1表示第1個引數、$2表示第2個引數等,$0為指令碼的名字,需要注意:從${10}開始,引數號需要用花括號括起來,如${10}、${11}、${100}、…。$*和[email protected]一樣,表示從$1開始的全部引數。
好,我們來編寫一個指令碼進行測試說明
vi testvar.sh
#!/bin/bash
echo "sky : $1"
echo "fans : $2"
echo "NB : $3"
echo "666 : $4"
執行指令碼:
sh testvar.sh
在上步中,我們執行指令碼時未給予引數,下面我們給予引數進行輸出內容
sh testvar.sh 1 2 3 4
在執行指令碼的時候,var.sh的指令碼接受了我們傳進去的4個引數,當shell解釋一個命令時,會將位置變數與命令列中的每一個引數關聯,第一個引數對應的就是"$1",第二個引數對應就是"$2",依次類推。
3.4特殊位置變數(shell指令碼中)
$0 | 指令碼自身名字(你命名的指令碼的名字) |
---|---|
$? | 返回上一條命令是否執行成功,0為執行成功,非0則為執行失敗 |
$# | 位置引數總數 |
$* | 所有的位置引數被看做一個字串 |
[email protected] | 每個位置引數被看做獨立的字串 |
$$ | 當前程序PID |
$! | 上一條執行後臺程序的PID |
3.4.1還是剛才的指令碼,我們新增進去$0的內容
vi testvar.sh
#!/bin/bash
echo $0
echo "sky : $1"
echo "fans : $2"
echo "NB : $3"
echo "666 : $4"
執行檢視結果:
sh testvar.sh 1 2 3 4
3.4.2 其他的變數我們試下一起放入到指令碼中,執行看會有什麼結果出現。
重新編輯指令碼
vi testvar.sh
cho $0
echo "sky : $1"
echo "fans : $2"
echo "NB : $3"
echo "666 : $4"
echo "------華麗的分割線——————"
echo "上條命令執行成功了沒(成功0,未成功非0) : $?"
echo "引數總數: $#"
echo "所有的位置引數被看做一個字串 : $*"
echo "每個位置引數被看做獨立的字串 : [email protected]"
echo "當前程序PID : $$"
執行結果:
哦?我們發現好像落掉了一個特殊位置變數,好那我們在加上,為了方便看出對比,我們這回在指令碼中又添加了一個變數引數 $5
vi testvar.sh
#!/bin/bash
echo $0
echo "sky : $1"
echo "fans : $2"
echo "NB : $3"
echo "666 : $4"
echo "777 : $5"
echo "------華麗的分割線——————"
echo "上條命令執行成功了沒(成功0,未成功非0) : $?"
echo "引數總數: $#"
echo "所有的位置引數被看做一個字串 : $*"
echo "每個位置引數被看做獨立的字串 : [email protected]"
echo "當前程序PID : $$"
echo "上一條執行後臺程序的PID : $!"
執行指令碼看結果:
sh testvar.sh
汗!!忘了帶引數了,重來!
sh testvar.sh 1 2 3 4 5
注意:給予引數的時候,中間一定要加空格,否則系統會理解為只給了一個引數內容。
sh testvar.sh 12345
這裡執行後的結果我們發現沒有後臺程序的PID,原因是什麼?對,就是因為我這裡並沒有執行後臺執行的程式,後臺執行的程式需要執行nohup命令。這裡我們就不做過多演示!
今天的講解就到這裡!