好的,所以我在處理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.
「全局變量缺乏」 更換線
?咦? **除非您另行聲明,否則所有**變量都是bash中的全局變量。 –
...你的問題是你在一個子進程中運行代碼,所以你設置的全局變量在該子進程退出時被清除。另見[BashFAQ#24](http://mywiki.wooledge.org/BashFAQ/024)。如果您正在分割子進程,則與使用其他語言的全局變量相同。 –
...最簡單的解決方案就是不要這麼做 - 也就是說,要確保設置變量的代碼在進程中。如果你用'{}'替換了你的'()',你就會被設置。 –