ファイル内の文字列を変数として使用する方法

ファイル内の文字列を変数として使用する方法

以下のような 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 と の両方でsedperlスイッチ-iはファイルをその場で編集し、すべての入力行を にs/foo/bar/置き換えます。したがって、最初の置換では最初のスペースが に置き換えられ、2 番目の置換では行末にが追加されます( )。foobar=""$

これらすべてはこれを変換します:

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

関連情報