變量在shell腳本間的傳遞

前幾篇文章中已經介紹過局部變量和環境變量的含義,接下來我們來拓展下,看看變量怎樣實現在shell腳本
中的傳遞shell腳本其實是用當前shell的子shell去執行的,所以在shell腳本中定義的普通變量只適用於當前
shell的子shell環境,也就是說在當前shell環境中不適用,也不適用於這個shell腳本的子shell。
在shell腳本中定義的環境變量可以傳承給它的子shell,但是也不能傳遞給當前shell(不能逆向傳遞)
如果在一個腳本中需要執行另一個腳本,並且運用其中的變量,改如何申明變量呢,我們來看一個例子:
/root/test1.sh內容如下:
#!/bin/bash
aaa=yuanfaxiang
echo "test1:$aaa"

/root/test2.sh內容如下:
#!/bin/bash
/root/test1.sh
echo "test2:$aaa"
執行test2.sh結果如下:
[root@centos ~]# sh test2.sh
test1:yuanfaxiang
test2:
從結果可以看出test1.sh沒有把變量aaa的值傳遞給test2.sh

我們把test2.sh改成:
#!/bin/bash
source /root/test1.sh
echo "test2:$aaa"
執行test2.sh結果如下:
[root@centos ~]# sh test2.sh
test1:yuanfaxiang
test2:yuanfaxiang
結果顯示test2.sh繼承了test1.sh中定義的變量aaa。
原因分析:在第一次執行test2.sh時,test1.sh被作爲了test2.sh的子shell來執行,其中定義的變量只
在test1.sh中起效,不能逆向傳遞到test2.sh中;而在第二次執行中,採用source來執行test1.sh,意思
是直接把test1.sh在當前的test2.sh中執行,沒有作爲子shell去執行,test1.sh中定義的變量,就影響
到了test2.sh。

如果我們再建一個test3.sh
#!/bin/bash
echo "test3:$aaa"

把test2.sh改成:
#!/bin/bash
source /root/test1.sh
echo "test2:$aaa"
/root/test3.sh
執行test2.sh:
[root@shenji ~]# sh test2.sh
test1:yuanfaxiang
test2:yuanfaxiang
test3:
結果顯示test3.sh沒有繼承test1.sh中申明的變量,因爲source /root/test1.sh只是讓test1.sh
中的變量在test2.sh中生效,aaa畢竟還是個普通局部變量,並不能被test3.sh這個子shell所繼承,
所以我們可以想到環境變量,把aaa變成test2.sh這個腳本的環境變量,讓test2.sh的子進程也能繼承。

將test1.sh改成:
#!/bin/bash
export aaa=yuanfaxiang
echo "test1:$aaa"
執行test2.sh後有如下結果:
[root@shenji ~]# sh test2.sh
test1:yuanfaxiang
test2:yuanfaxiang
test3:yuanfaxiang
在test1.sh中聲明瞭環境變量也就是全局變量,在test2.sh中用source執行test1.sh,將變量帶到了
test2.sh中,並使之成爲test2.sh執行過程中的環境變量,可以被test2.sh的子進程繼承,起到了順向
傳遞效果。

轉載自:

變量在shell腳本間的傳遞

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章