
以下のような conf ファイルの内容があります。
ファイル.conf:
key name
value pswd
今、私は上記のような2つの変数を持つスクリプトを書きたいです
スクリプト
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 行は基本的に、最初のフィールド (2 つを超える場合) を変数名として使用し、行の残りを値として使用します (これが$1=""
汚いトリックです)。
Terdon の提案によれば、提供された値にはスペースがありません。
awk '{print $1 "=" $2 }' file.conf > script.sh
答え2
シェルが 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
これらはすべて基本的に同じ考え方です。GNU と の両方でsed
、perl
スイッチ-i
はファイルをその場で編集し、すべての入力行を にs/foo/bar/
置き換えます。したがって、最初の置換では最初のスペースが に置き換えられ、2 番目の置換では行末にが追加されます( )。foo
bar
="
"
$
これらすべてはこれを変換します:
key name
value pswd
key1 foo bar
これに対して:
key="name"
value="pswd"
key1="foo bar"
答え3
私はあなたが望んでいることを少し違ったように解釈しました...つまり、file.conf
シェル変数の割り当てのセットであるかのようにソースする方法が欲しいということです。
. /path/to/file.conf
使ってみる
eval `while read var val; do echo "${var}='${val}'"; done < /path/to/file.conf`
の形式がfile.conf
ここで説明したものと異なっていないことを確認する必要があります。
ループ内の各割り当てで eval を呼び出すのではなく、出力全体で eval を意図的に使用していることに注意してください。これは、変数の割り当てがそこでグローバルになるかどうかわからないためです (リダイレクトされた入力のため、サブシェルで実行される可能性があります。誰か確実に知っていますか? テストすればいいと思います :-)
答え4
$
二重引用符は、その中でも 、 、バックスラッシュ、バックティック文字が依然として特別な意味を持つため、引用符としては最適な選択ではない可能性があります"
。
代わりに一重引用符 ( ) を使用します。key='name'
そうすれば、気にする必要があるのは引用符'
自体だけになります。
sed "s/'/'\\\\''/g;s/ /='/;s/\$/'/" < file.conf > file.sh