[Linux] 觀察在不同的寫法下,Shell 變數會否傳遞至子行程

[Linux] 觀察在不同的寫法下,Shell 變數會否傳遞至子行程

在 Linux shell 裡面,

有時會用到  NAME1=VALUE2 NAME2=VALUE2 program arg... 的方式,

帶環境變數給子行程 program。

但如果是用  for NAME in VALUE1 VALUE2 VALUE3; do program arg...; done 的方式的話,

這些變數也會帶下去嗎?這是我的疑問…

 

多想無益,直接來測試吧~

首先寫一個 test1.sh,裡面就是印出 PLAT 這個變數的值,

接著呼叫 test2.sh:

echo PLAT in test1=${PLAT}
sh test2.sh

 

test2.sh 就只印出 PLAT 變數的值:

echo PLAT in test2=$PLAT

 

來看看 for NAME in VALUE1 VALUE2 VALUE3; do program arg...; done 這種寫法吧~

子行程看來都讀不到 PLAT 的值,

看起來這種寫法比較類似單純的  NAME=VALUE1 宣告,

變數只停留在當前的 shell session,不會帶給叫起來的子行程:

testuser@localhost ~ $ for PLAT in a b c; do sh test.sh; done

PLAT in test1=
PLAT in test2=
PLAT in test1=
PLAT in test2=
PLAT in test1=
PLAT in test2=

 

如果是 NAME1=VALUE2 NAME2=VALUE2 program arg... 的方式的話,

就可以把 PLAT 變數值帶給子行程、孫行程(及其子孫) 了,

應該比較類似 export NAME=VALUE1 的寫法:

testuser@localhost ~ $ for PLAT in a b c; do PLAT in test1=$PLAT sh test.sh; done

PLAT in test1=a
PLAT in test2=a
PLAT in test1=b
PLAT in test2=b
PLAT in test1=c
PLAT in test2=c

 

Linux Shell 程式真的蠻多奇特要注意的地方呢…

(本頁面已被瀏覽過 107 次)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料