
我在終端機中設定一些環境變量,然後運行我的腳本。如何提取腳本中的變數?我需要了解他們的價值觀。簡單地稱呼它們是$MY_VAR1
行不通的;它是空的。
答案1
export
如果這些變數確實是呼叫腳本的環境中的環境變數(即,它們已使用 匯出),那麼它們會在您的腳本中可用。它們不存在表明您尚未匯出它們,或者您從它們根本不存在的環境中執行腳本,即使它們作為 shell 變數也是如此。
例子:
$ cat script.sh
#!/bin/sh
echo "$hello"
$ sh script.sh
(輸出的一個空行,因為hello
任何地方都不存在)
$ hello="hi there"
$ sh script.sh
(仍然只有一個空行作為輸出,因為hello
它只是一個 shell 變量,而不是一個環境變量)
$ export hello
$ sh script.sh
hi there
或者,僅為此腳本而不是在呼叫環境中設定環境變數:
$ hello="sorry, I'm busy" sh script.sh
sorry, I'm busy
$ env hello="this works too" sh script.sh
this works too
答案2
您需要確保在呼叫腳本之前導出您想要在腳本中存取的環境變數。 IE:
Unix> export MY_TEMP=/tmp
Unix> some_script.sh
現在some_script.sh 可以存取$MY_TEMP —— 當您呼叫shell 腳本時,您將獲得一個新環境,其中僅包含導出的變量,除非您透過在腳本命令前添加句點(“.”)來“獲取”它,並且一個空格,然後是您的腳本名稱:
Unix> . some_script.sh # runs in current environment
偵錯提示:在腳本頂部附近包含命令set
以查看腳本可以看到哪些變數。
答案3
另請注意,如果您希望它們僅在「腳本執行期間」存在,您可以將它們的匯出放入一個檔案中,然後在腳本中取得該檔案。
因為當您執行腳本時,它將在新的shell 中執行,這樣這些變數將僅在該子shell(及其後代)中導出,並且它們不會最終在您自己的shell 中,即,看起來就像您可以在腳本執行結束後自動取消設定它們。
例子:
# config.txt
export SECRET=foobar
# prog.sh
#!/usr/bin/env sh
source ./config.txt
echo $SECRET
現在運行它:
chmod +x prog.sh
./prog.sh
然後確認 SECRET 變數沒有洩漏到您自己的 shell 中:
echo $SECRET # <-- must echo a blank line