Shell腳本系列-shell入門第二講
1、普通環(huán)境變量與臨時(shí)環(huán)境變量
1.1、定義普通環(huán)境變量
[root@localhost ~]# VAR=value
注意:左邊的VAR是我們定義的一個(gè)變量名,右邊則是一個(gè)值,我們通過把值賦值給一個(gè)變量,從而達(dá)到引用一個(gè)變量就相當(dāng)于引用值的目的。一般上而言定義一個(gè)變量名也有命令法則,如下所示:
(1)、不能使用程序中的保留字,如if、while、for、print等字符串作為變量名
(2)、只能使用數(shù)字、字母、下劃線,可以組合使用,但不能以數(shù)字開頭
(3)、最好做到見名知意(建議這樣子來做)
1.2、定義臨時(shí)環(huán)境變量
[root@localhost ~]# export VAR=value
用法是一樣的,只是我們這里加上了一個(gè)export,普通環(huán)境變量和臨時(shí)環(huán)境變量的區(qū)別就是:普通環(huán)境變量只在當(dāng)前的shell終端有效,而臨時(shí)環(huán)境變量則是在當(dāng)前shell終端以及當(dāng)前shell的子終端中有效。
1.3、變量引用
直接使用$VAR即可,比如下面這樣,就可以把$VAR的值給打印出來。
[root@localhost ~]# echo $VAR
2、操作一下看看效果
[root@localhost ~]# tty
/dev/pts/0
[root@localhost ~]# ps axjf | grep pts/0
PPID ??PID ?PGID ??SID TTY ?????TPGID STAT ??UID ??TIME COMMAND
1016 36123 36123 36123 ? ??????????-1 Ss ??????0 ??0:01 ?\_ sshd: root@pts/0
36123 36125 36125 36125 pts/0 ???33060 Ss ??????0 ??0:00 ?| ??\_ -bash
36125 33060 33060 36125 pts/0 ???33060 R+ ??????0 ??0:00 ?| ??????\_ ps axjf
36125 33061 33060 36125 pts/0 ???33060 S+ ??????0 ??0:00 ?| ??????\_ grep --color=auto pts/0
可以看到當(dāng)前使用的終端是偽終端類型,序號(hào)為 pts/0。我們通過這個(gè)命令中,主要關(guān)注PPID、PID、COMMAND這三列,其中PPID表示父進(jìn)程,PID表示子進(jìn)程,COMMAND表示當(dāng)前父進(jìn)程執(zhí)行的命令,
可以看出來當(dāng) SSH 連接 Shell 時(shí),當(dāng)前終端 PPID(-bash)是 sshd 守護(hù)程序的 PID(pts/0),因此在當(dāng)前終端下的所有進(jìn)程的 PPID 都是-bash 的 PID(大家看到倒數(shù)第二行中PID號(hào)為36125,他是bash進(jìn)程的PID號(hào),而我們執(zhí)行的ps命令和grep命令則是的PPID都是36125,這說明ps和grep都是-bash的子進(jìn)程),比如執(zhí)行命令、運(yùn)行腳本。
所以當(dāng)在-bash 下設(shè)置的變量,只在-bash 進(jìn)程下有效,而-bash 下的子進(jìn)程 bash 是無效的,如果要在子進(jìn)程中生效需要你使用export,這樣才有效
例如:
[root@localhost ~]# NUM=666
[root@localhost ~]# echo $NUM
666
[root@localhost ~]# bash ??????? ## 此時(shí)我又進(jìn)入了子shell中
[root@localhost ~]# echo $NUM ?? ## 發(fā)現(xiàn)是空值
然后我使用export定義一下
[root@localhost ~]# unset NUM ## 先接觸一下環(huán)境變量,重新定義
[root@localhost ~]# export NUM=888
[root@localhost ~]# echo $NUM
888
[root@localhost ~]# bash ????? ## 此時(shí)我又進(jìn)入了子shell中
[root@localhost ~]# echo $NUM ## 子shell中也是可以使用這個(gè)值的
888
當(dāng)然,上面的export例子也僅僅是對(duì)當(dāng)前的終端以及子shell終端有效,如果你重新開一個(gè)新的終端,就不會(huì)生效了。比如之前我們使用的是pts/0,現(xiàn)在重新開的窗口,其終端是 pts/1,那么pts/1這個(gè)終端中就沒辦法使用在pts/0中定義的變量了。
[root@localhost ~]# tty
/dev/pts/2
[root@localhost ~]# echo $NUM
此外,shell腳本也是相當(dāng)于起了一個(gè)子shell終端,因此我們?cè)诿钚兄卸x的NUM變量,即便在shell腳本中也是有效的,比如我們還是在pts/0這個(gè)終端上舉例子:
[root@localhost ~]# tty
/dev/pts/0
[root@localhost ~]# cat bash.sh
#!/bin/bash
echo $NUM
[root@localhost ~]# bash bash.sh
666
聲明:文章來源于網(wǎng)絡(luò),如有侵權(quán)請(qǐng)聯(lián)系刪除!