
我有一個如下所示的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/
替換。因此,第一次替換將替換第一個空格,第二次替換將在行尾添加一個 ( )。foo
bar
="
"
$
所有這些都會將其轉換為:
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