簡體   English   中英

在shell / bash腳本中使用文件之間的變量

[英]Using variables between files in shell / bash scripting

這個問題已在這里多次發布,但它似乎永遠不會回答我的問題。

我有兩個腳本。 第一個包含一個或多個變量,第二個腳本需要這些變量。 第二個腳本還需要能夠更改第一個腳本中的變量。

我對源(包含變量的第一個腳本運行第二個腳本)或導出(使用環境變量)不感興趣。 我只是想確保第二個腳本可以讀取和更改(獲取和設置)第一個腳本中可用的變量。

(PS。如果我誤解了采購或出口是如何運作的,並且它適用於我的情況,請告訴我。我不會完全接受這些方法,在我讀完之后,我只是不認為那些事情會做我想要的)

環境變量是每個進程。 一個進程無法修改另一個進程中的變量。 你要求的是不可能的。

腳本的常用解決方法是源代碼,它通過在同一個shell進程中運行兩個腳本來工作,但是你說你不想這樣做。

我也有一些想法。 我會使用文件作為變量。 例如,在腳本1中,您用於將變量值寫入文件:

echo $varnum1 > /home/username/scriptdir/vars/varnum1
echo $varnum2 > /home/username/scriptdir/vars/varnum2

在腳本2中,您可以將文件中的值讀回變量:

$varnum1=$(cat /home/username/scriptdir/vars/varnum1)
$varnum2=$(cat /home/username/scriptdir/vars/varnum2)

兩個腳本都可以在任何給定時間讀取或寫入變量。 從理論上講,兩個腳本可以嘗試同時訪問同一個文件,我不確定究竟會發生什么,但由於每個文件只包含一個值,因此讀取或寫入的時間應該非常短。 為了減少那些時間你可以使用ramdisk。

我認為這比編輯對方的腳本要好得多(yuk!)。 實時編輯腳本會使腳本陷入混亂只有在編輯完成后再次啟動腳本時才有效。

祝好運!

因此,經過長時間的網絡搜索和大量的嘗試,我終於找到了某種解決方案。 實際上,這很簡單。

但是有一些先決條件。

  1. 你想要設置的變量必須存在於你試圖設置它的文件中(我猜這個變量也可以在它不存在時創建,但那不是我想要的這里)。
  2. 你試圖設置變量的文件必須存在(顯然。我再次猜測也可以這樣做,但同樣,不是我想要的)。

sudo sed -i 's/^\\(VARNAME=\\).*/\\1VALUE/' FILENAME

因此,即在文件test.ini名為Var1的變量設置為值5
sudo sed -i 's/^\\(Var1=\\).*/\\15/' test.ini


sudo grep -Po '(?<=VARNAME=).*' FILENAME

因此,即從文件test.ini讀取名為Var1的變量
sudo grep -Po '(?<=Var1=).*' test.ini


只是要確定

我在運行腳本時發現了一些問題,該腳本設置的變量來自與腳本所在文件夾不同的文件夾。 為確保始終正確,您可以執行以下兩項操作之一:

sudo sed -i 's/^\(VARNAME=\).*/\1VALUE/' `dirname $0`/FILENAME

所以基本上,只需將`dirname $0`/ (包括反引號)放在文件名前面。

另一種選擇是使`dirname $0`/變量(再次包括反引號),這看起來像這樣。

my_dir=`dirname $0`

sudo sed -i 's/^\(VARNAME=\).*/\1VALUE/' $my_dir/FILENAME

所以基本上,如果你有一個名為test.ini的文件,它包含這一行: Var1= (在我的測試中,變量可以開始為空,你仍然可以設置它。里程可能會有所不同。),你將能夠設置並獲取Var1的值


我可以確認這是有效的(對我而言),但是既然你們都有了更多的腳本編寫經驗,那么我沒想出來,我猜這不是一個好方法。

另外,我無法告訴你關於上述命令中發生的事情的第一件事,我只知道它們有效。

所以,如果我做了一些愚蠢的事情,或者你可以向我解釋上述命令中發生了什么,請告訴我。 我非常想知道如果這個解決方案,你們會怎么想。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM