Bash

從配置文件訪問分段變數

  • August 27, 2020

我有一個帶有分段數據的配置文件,如下所述。使用 shell 腳本訪問每個變數。我為此使用 sed 命令,現在我面臨一個問題,比如我忘記配置一個變數範例:名稱

$$ APP1 $$這將需要$$ APP2 $$姓名。

配置文件:

[APP1]
name=Application1
StatusScript=/home/status_APP1.sh
startScript=/home/start_APP1.sh
stopScript=/home/stop_APP1.sh
restartScript=/home/restart.APP1.sh

[APP2]
name=Application2
StatusScript=/home/status_APP2.sh
startScript=/home/start_APP2.sh
stopScript=/home/stop_APP2.sh
restartScript=/home/restart.APP2.sh
logdir=/log/APP2/
.
.
.
.
.
[APPN]
name=ApplicationN
StatusScript=/home/status_APPN.sh
startScript=/home/start_APPN.sh
stopScript=/home/stop_APPN.sh
restartScript=/home/restart.APPN.sh
logdir=/log/APPN

外殼命令使用:

sed -nr "/^\[APP1\]/ { :l /^name[ ]*=/ { s/.*=[ ]*//; p; q;}; n; b l;}"

有沒有辦法解決這個問題,如果某個變數沒有配置在一個部分下它通過null或0作為變數值。

你可以像這樣創建一個 shell 函式:

printSection()
{
 section="$1"
 found=false
 while read line
 do
   [[ $found == false && "$line" != "[$section]" ]] &&  continue
   [[ $found == true && "${line:0:1}" = '[' ]] && break
   found=true
   echo "$line"
 done
}

然後,您可以像命令一樣使用 printSection,並將該部分作為參數傳遞,例如:

printSection APP2

要獲取您的參數,您現在可以使用更簡單的 sed,例如:

printSection APP2 | sed -n 's/^name=//p'

這將在標準輸入上執行並寫入標準輸出。因此,如果您的範例配置文件名為 /etc/application.conf,並且您想將 APP2 的名稱儲存在變數 app2name 中,您可以這樣寫:

app2name=$(printSection APP2 | sed -n 's/^name//p/' < /etc/applications.conf)

或者,您可以將參數部分建構到函式中並完全跳過 sed,如下所示:

printValue()
{
 section="$1"
 param="$2"
 found=false
 while read line
 do
   [[ $found == false && "$line" != "[$section]" ]] &&  continue
   [[ $found == true && "${line:0:1}" = '[' ]] && break
   found=true
   [[ "${line%=*}" == "$param" ]] && { echo "${line#*=}"; break; }
 done
}

然後你會像這樣分配你的var:

app2name=$(printValue APP2 name < /etc/applications.conf)

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