2016-09-20 67 views
0

好的,所以我在處理Bash時遇到了麻煩,而且缺少全局變量。我遇到的問題是,在while循環中,我不得不做一個for循環,並在該循環內我將調用一個腳本,我需要動態更改變量$ NAME。不幸的是,我不知道它是什麼,直到我嘗試了幾個不同的選項。變量在原始過程中設置後永遠不想更改。今天我已經做了大量的研究,我發現這是因爲在這樣的文件中讀取一個文件會打開一個子shell,並且它不能編輯父進程中的值。我已經嘗試了多個文件來源來動態地導出變量,但這也不起作用。Bash編輯子流程的值?

編輯:這個例子是有趣的,但它是我在工作中使用的相同邏輯。無法顯示工作代碼。

#!/usr/bin/env bash 
FILE=$1 
SCRIPT="FOO" 
NAME="TEST" 

#create script 
cat > "${SCRIPT}" <<EOF 
HELLO WORLD, $NAME 
EOF 

while read line; do 
echo $line 
echo $SCRIPT 
    for i in `seq 1 10`; do 
    (
    NAME="MEGAMAN" 
    echo $NAME 
    ) 
    done 
done < "$FILE" 
#echo $NAME 
cat > "${SCRIPT}" <<EOF 
HELLO WORLD, $NAME 
EOF 

我的輸出:

[email protected]:~/workspace/Script $ ./Main FOO 
HELLO WORLD, TEST 
FOO 
MEGAMAN 
MEGAMAN 
MEGAMAN 
MEGAMAN 
MEGAMAN 
MEGAMAN 
MEGAMAN 
MEGAMAN 
MEGAMAN 
MEGAMAN **this output is fine 

和文件它輸出:

HELLO WORLD, TEST **This file should say MEGAMAN. 
+1

「全局變量缺乏」 更換線

./child-script.sh 

?咦? **除非您另行聲明,否則所有**變量都是bash中的全局變量。 –

+1

...你的問題是你在一個子進程中運行代碼,所以你設置的全局變量在該子進程退出時被清除。另見[BashFAQ#24](http://mywiki.wooledge.org/BashFAQ/024)。如果您正在分割子進程,則與使用其他語言的全局變量相同。 –

+0

...最簡單的解決方案就是不要這麼做 - 也就是說,要確保設置變量的代碼在進程中。如果你用'{}'替換了你的'()',你就會被設置。 –

回答

1

這是不可能給一個變量從子進程改變,是一個子shell或一些其他的殼腳本。如果你必須這樣做,你必須找到一個方法讓子進程與父進程通信。例如,如果您正在調用外部腳本,並且您希望獲取該腳本計算的值並將其存儲在父腳本的變量中,則可以讓腳本在其stdout中輸出該值,然後將其捕獲到父級腳本中過程,例如

# child-script.sh: 
myvar=.... # compute some value 
echo "$myvar" # put that at the end of the script 

和家長,由

myvar="$(./child-script.sh)" 
+0

但是如果我需要傳遞變量,那麼我需要傳入的變量是for循環中的變量。我想在這種情況下,它會是數字1到10?我需要將它作爲$ NAME – user3505901

+0

@ user3505901插入到腳本中,'$()'運行一個子shell。子殼繼承其父代的所有狀態,包括變量的當前值。所以是的,如果你想要走這條路線,你可以運行'myvar = $(涉及「$ i」)'(儘管我不會這樣做,除非你完全避免使用subshel​​l)。 –