Environment-Variables

如何從一個腳本中獲取變數的值並將其導入另一個腳本?

  • December 21, 2018

如何從一個腳本中獲取變數的值並將其導入另一個腳本?但問題是我要獲取變數值的腳本也有一些我不想執行的命令:

假設這是 script1.sh:

variable="Hello"
#some command here e.g. yum check-update

在 script2.sh 中:

echo $var

我找到了一種方法,其中使用 EXPORT 命令並將 ./script1.sh 放在 script2.sh 中,但它執行其他命令。

那麼,如何在不執行其中的命令的情況下獲取變數的值呢?我希望這個問題很清楚。提前致謝!

總而言之,您希望在script1.sh不執行script1.sh. 我會假設這script1.sh不在你的控制之下,可能是因為它是供應商提供的,或者是由頑固的同事管理的,或者類似的問題,這使得它script1.sh必須按原樣使用。

我將介紹兩種方法。第一個有利於從 中獲取特定變數script1.sh,一次一個:

var=$(awk -F'"' '/^variable=/ {print $2}' script1.sh )
echo $var

這用於awk讀取(不執行,只是讀取)script1.shawk查找以開頭的行,variable=然後寫下該行雙引號後出現的內容。的輸出awk被擷取到變數var中。

更詳細地說:

  • 該語句的格式為var=$(...)。這意味著括號中的任何內容都作為 bash 命令執行,並將其標準輸出分配給變數var
  • 在括號內,我們有awk命令:awk -F'"' '/^variable=/ {print $2}' script1.sh。讓我們分部分考慮。
  • awk將行(記錄)分成欄位。 -F'"'告訴 awk 使用雙引號作為欄位分隔符。
  • /^variable=/告訴awk將操作限制在以 . 開頭的行variable=。因此,所有雜項命令都script1.sh將被忽略。
  • {print $2}告訴awk列印第二個欄位。這意味著雙引號字元的第一次和第二次出現之間的任何內容。
  • 最後一個參數awk告訴它要讀取什麼文件:script1.sh.

上述方法適用於一次處理一個變數,並允許您根據需要重命名變數。

如何處理許多變數

如果要獲取 中分配的所有變數script1.sh,請考慮:

source <(grep -E '^\w+=' script1.sh)

這用於grepscript1.sh看起來像變數賦值的所有行中提取。然後這些行在目前 shell 中執行,分配變數。

如果您使用這種方法,首先檢查以確保您需要所有變數並且沒有任何會干擾您正在做的事情。如果有,我們可以用第二個grep命令排除它們。

依次考慮這些部分:

  • source file告訴 shellfile在目前 shell 中執行。
  • <(...)稱為程序替換。它允許我們使用命令的輸出代替文件名。
  • 該命令grep -E '^\w+=' script1.sh提取所有看起來像變數賦值的行。如果您在命令行上單獨執行此命令,您應該會看到如下內容:
variable="Hello"
var2="Value2"

等等。您應該首先執行此操作並檢查輸出以確保這些是您要執行的行。

引用自:https://unix.stackexchange.com/questions/136151