Bash

如何解析ini文件並將其轉換為bash數組變數?

  • February 24, 2022

我正在嘗試將 ini 文件轉換為 bash 數組變數。範例ini如下:

[foobar]
session=foo
path=/some/path

[barfoo]
session=bar
path=/some/path

所以這些變成:

session[foobar]=foo
path[foobar]=/some/path
session[barfoo]=bar

等等。

現在,我只能想出這個命令

awk -F'=' '{ if ($1 ~ /^\[/) section=$1; else if ($1 !~ /^$/) print $1 section "=" $2 }'

另外,另一個問題是,它沒有考慮附近的空間=。我認為sed可能更適合這項工作,但我不知道如何在sed.

那麼知道如何做到這一點嗎?

Gawk 接受正則表達式作為欄位分隔符。以下內容消除了等號周圍的空格,但將它們保留在該行的其餘部分。在值周圍添加引號,以便在執行 Bash 分配時保留這些空格(如果有)。我假設部分名稱將是數字變數,但如果您使用的是 Bash 4,則很容易將其調整為使用關聯數組,並將部分名稱本身作為索引。

awk -F ' *= *' '{ if ($1 ~ /^\[/) section=$1; else if ($1 !~ /^$/) print $1 section "=" "\"" $2 "\"" }'

請注意,您可能還希望刪除 Khaled 顯示的空格(僅在 $1 和部分上),因為 Bash 變數名稱不能包含空格。

此外,如果值包含等號,此方法將不起作用。

另一種技術是使用 Bashwhile read循環並在讀取文件時執行分配,declare這樣可以避免大多數惡意內容。

foobar=1
barfoo=2  # or you could increment an index variable each time a section is found
while IFS='= ' read var val
do
   if [[ $var == \[*] ]]
   then
       section=$var
   elif [[ $val ]]
   then
       declare "$var$section=$val"
   fi
done < filename

同樣,可以很容易地支持關聯數組。

引用自:https://serverfault.com/questions/345665