前幾篇文章中已經(jīng)介紹過局部變量和環(huán)境變量的含義,接下來我們來拓展下,看看變量怎樣實(shí)現(xiàn)在shell腳本
中的傳遞shell腳本其實(shí)是用當(dāng)前shell的子shell去執(zhí)行的,所以在shell腳本中定義的普通變量只適用于當(dāng)前
shell的子shell環(huán)境,也就是說在當(dāng)前shell環(huán)境中不適用,也不適用于這個(gè)shell腳本的子shell。
在shell腳本中定義的環(huán)境變量可以傳承給它的子shell,但是也不能傳遞給當(dāng)前shell(不能逆向傳遞)
如果在一個(gè)腳本中需要執(zhí)行另一個(gè)腳本,并且運(yùn)用其中的變量,改如何申明變量呢,我們來看一個(gè)例子:
/root/test1.sh內(nèi)容如下:
#!/bin/bash
aaa=yuanfaxiang
echo "test1:$aaa"
/root/test2.sh內(nèi)容如下:
#!/bin/bash
/root/test1.sh
echo "test2:$aaa"
執(zhí)行test2.sh結(jié)果如下:
[root@centos ~]# sh test2.sh
test1:yuanfaxiang
test2:
從結(jié)果可以看出test1.sh沒有把變量aaa的值傳遞給test2.sh
我們把test2.sh改成:
#!/bin/bash
source /root/test1.sh
echo "test2:$aaa"
執(zhí)行test2.sh結(jié)果如下:
[root@centos ~]# sh test2.sh
test1:yuanfaxiang
test2:yuanfaxiang
結(jié)果顯示test2.sh繼承了test1.sh中定義的變量aaa。
原因分析:在第一次執(zhí)行test2.sh時(shí),test1.sh被作為了test2.sh的子shell來執(zhí)行,其中定義的變量只
在test1.sh中起效,不能逆向傳遞到test2.sh中;而在第二次執(zhí)行中,采用source來執(zhí)行test1.sh,意思
是直接把test1.sh在當(dāng)前的test2.sh中執(zhí)行,沒有作為子shell去執(zhí)行,test1.sh中定義的變量,就影響
到了test2.sh。
如果我們?cè)俳ㄒ粋€(gè)test3.sh
#!/bin/bash
echo "test3:$aaa"
把test2.sh改成:
#!/bin/bash
source /root/test1.sh
echo "test2:$aaa"
/root/test3.sh
執(zhí)行test2.sh:
[root@shenji ~]# sh test2.sh
test1:yuanfaxiang
test2:yuanfaxiang
test3:
結(jié)果顯示test3.sh沒有繼承test1.sh中申明的變量,因?yàn)閟ource /root/test1.sh只是讓test1.sh
中的變量在test2.sh中生效,aaa畢竟還是個(gè)普通局部變量,并不能被test3.sh這個(gè)子shell所繼承,
所以我們可以想到環(huán)境變量,把a(bǔ)aa變成test2.sh這個(gè)腳本的環(huán)境變量,讓test2.sh的子進(jìn)程也能繼承。
將test1.sh改成:
#!/bin/bash
export aaa=yuanfaxiang
echo "test1:$aaa"
執(zhí)行test2.sh后有如下結(jié)果:
[root@shenji ~]# sh test2.sh
test1:yuanfaxiang
test2:yuanfaxiang
test3:yuanfaxiang
在test1.sh中聲明了環(huán)境變量也就是全局變量,在test2.sh中用source執(zhí)行test1.sh,將變量帶到了
test2.sh中,并使之成為test2.sh執(zhí)行過程中的環(huán)境變量,可以被test2.sh的子進(jìn)程繼承,起到了順向
傳遞效果。