2017-06-09 12 views
2

設定ファイル全体を変数として保存するawkコマンドを作ろうとしています。AWKを使って設定ファイルを解析する

設定ファイルには、(キーがスペースを持っていることはありませんが、値があります)次の形式である:

key=value 
key2=value two 

そして、私のawkコマンドは次のとおりです。

$(awk -F= '{printf "declare %s=\"%s\"\n", $1, $2}' $file) 

外側サブシェルなく、これを実行する$(...)結果として、正確なコマンドが出力されるようになるので、私の質問はAWKについてはあまりなく、AWKの出力をどのようにコマンドとして実行することができるのかについて詳しく説明しています。それ以来、二重引用符は、値が格納され、多少問題がある

declare 'key="value"' 

コマンドが評価されます。さらに悪いことには、スペースが、その結果、導入されたとき:もちろん

declare 'key2="value' two" 

、私は引用符を削除することはできませんまたはマルチワード値は問題を引き起こします。

set -f,evalsystem()など、私が見つけたソリューションはすべて試しました。

+0

もし私が 'eval $(echo k = value 2 | awk -F = '{printf"%s = \ "%s \" \ n "、$ 1、$ 2}')' 'を宣言してから' echo $ k 'それは私に値2を返します。それはあなたのために働いていないのですか? – jas

答えて

2

これにはAwkを使用する必要はありませんが、組み込み機能を使用することでこれを行うことができます。正しく入力リダイレクション

#!/bin/bash 

while IFS== read -r k v; do 
    declare "$k"="$v" 
done < config_file 

を使用して設定ファイルを読み、sourceが明示的に利用できない場合

$ source script.sh 
$ echo "$key" 
value 
$ echo "$key2" 
value two 

としてファイルをソース、それを行うのPOSIX -ly方法はただ

. ./script.sh 
を行うことであろう
+1

sourceコマンドは実際に私が必要としていたものです。私は 'source <(awk .....)'をやってしまいましたが、あなたの答えは不要なツールを使わない方が優れていると私は尊敬しています。 – Addison

関連する問題