如何使用檔案中的字串作為變數

如何使用檔案中的字串作為變數

我有一個如下所示的conf文件內容。

文件.conf:

key name
value pswd

現在我想編寫一個腳本來包含上面的兩個變量

腳本文件

key="name"      #key as variable
value="pswd"    #value as variable

. /path/to/file.conf給我鍵和值命令未找到錯誤。

答案1

嘗試

 awk 'NF>1 { var=$1 ; $1 = "" ; printf "%s=\"%s\"\n",var,$0; }' file.conf > script.sh

該 awk 行基本上使用第一個欄位(當超過兩個時)作為 var 名稱,然後使用其餘行作為值(因此是$1=""骯髒的技巧)。

根據 Terdon 的建議,提供的值中沒有空間。

 awk '{print $1 "=" $2 }' file.conf > script.sh

答案2

假設你的 shell 是 bourne 風格的,其中變數是用var="value"GNU定義的sed,你可以這樣做:

sed -i 's/ /="/;s/$/"/' file.conf

或者

sed -i -e 's/ /="/' -e 's/$/"/' file.conf

或者

perl -i -pe 's/ /="/;s/$/"/' file.conf

這些基本上都是同一個想法。在 GNUsed和中perl-i開關將就地編輯檔案並在每個輸入行上s/foo/bar/替換。因此,第一次替換將替換第一個空格,第二次替換將在行尾添加一個 ( )。foobar=""$

所有這些都會將其轉換為:

key name
value pswd
key1 foo bar

對此:

key="name"
value="pswd"
key1="foo bar"

答案3

我對你想要的東西的解釋有點不同......即你想要一種源方式,file.conf就好像它是一組 shell 變量賦值一樣 - 所以而不是

. /path/to/file.conf

嘗試使用

eval `while read var val; do echo "${var}='${val}'"; done < /path/to/file.conf`

您需要確保 的格式file.conf沒有偏離您在此處描述的格式。

請注意,我故意在整個輸出上使用 eval,而不是在循環內的每個賦值上呼叫 eval,因為我不確定變數賦值是否是全域的(由於重定向的輸入,它們可能在子 shell 中完成) - 有人確定嗎?

答案4

雙引號可能不是引號的最佳選擇,因為在雙引號內,$"、 反斜線和反引號字元仍然很特殊。

我會使用單引號字元 ( key='name') 來代替,因為這樣您唯一需要擔心的字元就是'它本身。

sed "s/'/'\\\\''/g;s/ /='/;s/\$/'/" < file.conf > file.sh

相關內容