前幾篇文章中已經介紹過局部變量和環境變量的含義,接下來我們來拓展下,看看變量怎樣實現在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的子進程繼承,起到了順向 傳遞效果。
轉載自: