1. 程式人生 > >我們一起學shell之三:shell變數講解

我們一起學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命令。這裡我們就不做過多演示!

今天的講解就到這裡!