Bash
從配置文件訪問分段變數
我有一個帶有分段數據的配置文件,如下所述。使用 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)