一、分類
按照生命周期分類:
- 永久的環(huán)境變量:分為系統(tǒng)級(jí)和用戶級(jí)九府,需要手動(dòng)修改相關(guān)配置文件
- 臨時(shí)的環(huán)境變量:使用
export
命令在終端聲明冗荸,只在當(dāng)前終端有效,關(guān)閉終端后變量失效
按照作用域分類:
- 系統(tǒng)環(huán)境變量:對(duì)所有用戶所有 shell 均有效
- 用戶環(huán)境變量:只對(duì)某個(gè)用戶有效
- shell 環(huán)境變量:只在某個(gè) shell 中有效杜窄,即臨時(shí)環(huán)境變量
二肠骆、環(huán)境變量與自定義變量
環(huán)境變量是相對(duì)于進(jìn)程而言的概念,可以被子進(jìn)程繼承
啟動(dòng)終端就會(huì)啟動(dòng) shell塞耕,shell 就是一個(gè)進(jìn)程蚀腿,在 shell 里設(shè)置的環(huán)境變量會(huì)被子進(jìn)程繼承。它對(duì)當(dāng)前進(jìn)程及其子進(jìn)程有效扫外,對(duì)父進(jìn)程無效
自定義變量是相對(duì)于 shell 中的命令而言的概念莉钙,通常后面會(huì)接一個(gè)命令,這種變量不會(huì)被子進(jìn)程繼承筛谚。它只對(duì)當(dāng)前進(jìn)程有效磁玉,對(duì)父進(jìn)程和子進(jìn)程均無效
上面的各種分類,都是針對(duì)環(huán)境變量而言
mcdx@ubuntu:~$ shiyanlou=1 # 自定義變量驾讲,只對(duì)當(dāng)前進(jìn)程有效
mcdx@ubuntu:~$ set | grep shiyanlou
shiyanlou=1
mcdx@ubuntu:~$ env | grep shiyanlou
mcdx@ubuntu:~$ export | grep shiyanlou
mcdx@ubuntu:~$ name=world # 自定義變量
mcdx@ubuntu:~$ echo hello $name
hello world
mcdx@ubuntu:~$ export shiyanlou=2 # 環(huán)境變量蚊伞,對(duì)當(dāng)前進(jìn)程及其子進(jìn)程均有效
mcdx@ubuntu:~$ set | grep shiyanlou
_=shiyanlou
shiyanlou=2
mcdx@ubuntu:~$ env | grep shiyanlou
shiyanlou=2
mcdx@ubuntu:~$ export | grep shiyanlou
declare -x shiyanlou="2"
-
set
顯示當(dāng)前 shell 中的所有變量,包括自定義變量 -
env
顯示與當(dāng)前用戶有關(guān)的所有環(huán)境變量 -
export
顯示的是從 shell 導(dǎo)入到用戶環(huán)境的變量吮铭,也就是從自定義變量變成了用戶級(jí)環(huán)境變量的變量
三时迫、創(chuàng)建各種變量的命令
3.1、export
將自定義變量升級(jí)為用戶級(jí)環(huán)境變量
上面說的 export 的顯示環(huán)境變量的作用谓晌,就是源于此
只要 export 里有的掠拳,env 里都有
這個(gè)就不舉例了
3.2、read
讀取標(biāo)準(zhǔn)輸入并將其賦值給自定義變量
mcdx@ubuntu:~$ read xxx
world
mcdx@ubuntu:~$ echo hello $xxx
hello world
mcdx@ubuntu:~$ read James Nash # 一次設(shè)置多個(gè)
Leborn Steve
mcdx@ubuntu:~$ echo $James $Nash
Leborn Steve
3.3纸肉、declare
定義自定義變量和用戶級(jí)環(huán)境變量
mcdx@ubuntu:~$ declare Durant=Kevin # 自定義變量
mcdx@ubuntu:~$ echo $Durant
Kevin
mcdx@ubuntu:~$ set | grep Durant
Durant=Kevin
mcdx@ubuntu:~$ env | grep Durant # env 是保存用戶級(jí)環(huán)境變量的溺欧,顯然找不到
mcdx@ubuntu:~$ declare -x Curry=Stephen # -x 選項(xiàng)定義用戶級(jí)環(huán)境變量
mcdx@ubuntu:~$ echo $Curry
Stephen
mcdx@ubuntu:~$ set | grep Curry
Curry=Stephen
mcdx@ubuntu:~$ env | grep Curry # 找到了
Curry=Stephen
四、引用變量
4.1毁靶、引號(hào)的使用
shiyanlou:~/ $ u1=s1
shiyanlou:~/ $ u2=hello_$u1
shiyanlou:~/ $ echo $u2
hello_s1
shiyanlou:~/ $ u2="hello_$u1_world"
shiyanlou:~/ $ echo $u2
hello_
shiyanlou:~/ $ u2="hello_$u1""_world"
shiyanlou:~/ $ echo $u2
hello_s1_world
shiyanlou:~/ $ u2='hello_$u1''_world'
shiyanlou:~/ $ echo $u2
hello_$u1_world
4.2胧奔、變量擴(kuò)展
引用變量除了使用 $var
格式直接引用變量之外,還可以使用 ${var}
的方式對(duì)變量進(jìn)行擴(kuò)展预吆。常見的形式如下表:
表達(dá)式 | 說明 |
---|---|
${var} |
等同于 $var
|
${var:-word} |
如果 $var 的變量值為空或未賦值龙填,則返回 word 字符串,防止因變量是空值或未定義而導(dǎo)致異常。 |
${var:=word} |
如果 $var 的變量值為空或未賦值岩遗,則設(shè)置這個(gè)變量值為 word 扇商,并返回其值。位置變量和狀態(tài)變量等特殊變量不適用宿礁“钙蹋基本同上一個(gè),但該變量又額外給 $var 變量賦值了梆靖。 |
${var:?word} |
如果 $var 的變量值為空或未賦值控汉,那么 word 字符串將被作為標(biāo)準(zhǔn)錯(cuò)誤輸出,否則輸出變量的值返吻。用于捕捉由于變量未定義而導(dǎo)致的錯(cuò)誤姑子,并退出程序。 |
${var:+word} |
如果 $var 的變量值為空或未賦值测僵,則什么都不做街佑,否則返回 word 字符串的值,也就是整個(gè)表達(dá)式的值為 word 捍靠。 |
4.3沐旨、特殊變量
在 bash
中,還有兩種特殊的變量榨婆,分別為位置變量和狀態(tài)變量磁携。
位置變量也叫位置參數(shù),是 bash
腳本執(zhí)行時(shí)寫入命令行的參數(shù)或選項(xiàng)纲辽,會(huì)傳遞給腳本或函數(shù)颜武。位置變量為 $n
,n 是一個(gè)非負(fù)的整數(shù)拖吼,表示第幾個(gè)參數(shù)。例如这吻,第一個(gè)參數(shù)是 $1
吊档,第二個(gè)參數(shù)是 $2
,在 n 大于等于 10 的時(shí)候唾糯,需要使用 ${n}
mcdx@ubuntu:~$ cat test.sh
echo $1 $2
echo ${12} $12
mcdx@ubuntu:~$ source test.sh 1 2 3 4 5 6 7 8 9 0 a b c
1 2
b 12 # 這個(gè) 12 怎么來的呢怠硼?$12 相當(dāng)于 $1 加上 2
狀態(tài)變量,見下表:
變量 | 含義 |
---|---|
$0 |
當(dāng)前腳本的文件名 |
$# |
傳遞給腳本或函數(shù)的參數(shù)數(shù)量 |
$* |
傳遞給腳本或函數(shù)的所有參數(shù) |
$? |
獲取執(zhí)行上一個(gè)指令的執(zhí)行狀態(tài)返回值(0 為成功移怯,非零為失斚懔А),我們之前已經(jīng)用到了 |
$$ |
獲取當(dāng)前執(zhí)行的 shell 腳本的進(jìn)程號(hào)(PID) |
$! |
獲取上一個(gè)在后臺(tái)工作的進(jìn)程的進(jìn)程號(hào) |
$_ |
獲取在此之前執(zhí)行的命令或腳本的最后一個(gè)參數(shù) |
五舟误、刪除變量
mcdx@ubuntu:~$ echo $shiyanlou
2
mcdx@ubuntu:~$ unset shiyanlou
mcdx@ubuntu:~$ echo $shiyanlou
mcdx@ubuntu:~$