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

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

以下のように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行はデフォルトで最初のフィールド(3つ以上の場合)をvar名として使用し、行の残りの部分を値として使用します(したがって$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

これらは基本的に同じ考えです。 GNUsedとLinuxperlでは-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

関連情報