2017-09-12 11 views
0

私はAWKにENV変数を渡す次のコードを持っています。AWKがENV変数を渡す

awk 'function pr(sp, k, v){ # prints key-value pair with indentation 
     printf "%s\047%s\047: \047%s\047,\n",sp,k,v; 
    } 
    BEGIN { 
    db_user = ENVIRON["DB_USER"] 
    db_pass = ENVIRON["DB_PASS"] 
    db_name = ENVIRON["DB_NAME"] 
    } 
    /sqlite/{ sub(/sqlite[0-9]*/,"mysql",$0) } 
    /NAME/{ sp=substr($0,1,index($0,"\047")-1); 
      print sp$1" \047db_name\047,"; 
      pr(sp,"USER", db_user); pr(sp,"PASSWORD", db_pass); 
      pr(sp,"HOST","localhost"); pr(sp,"PORT",""); next 
    }1' 

db_nameをENV変数に置き換えることができます。

db_name = django 

私の結果は以下のとおりです。

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.mysql', 
     'NAME': 'db_name', 
     'USER': 'django', 
     'PASSWORD': 'django', 
     'HOST': 'localhost', 
     'PORT': '', 
     } 
} 
+0

次のように変数から書式指定子を分離して行うために完全にprintfを使用し_not_その後、何をして働いていますか? – Inian

+0

print sp $ 1 "\ 047db_name \ 047、"; Djangoに値を渡すのではなく、単にdb_nameを渡します。 – Ankh2054

+0

@ Ankh2054:はい、 'print'への文字列が引用符で囲まれているので、変数の値は展開されません。 'printf'を使用してください – Inian

答えて

1

問題がAwkprint文の間違って使用することです。このGNU Awk print()ページからわかるように、変数を引用符の外に移動すると、展開された値が表示されます。

print sp$1" \047db_name\047,"; 
#    ^^^^^^^ Awk does not understand db_name within quotes 

次のように引用符の外にしてください。

print sp$1" \047"db_name"\047," 

(または)

printf "%s %s \047%s\047,\n",sp,$1,db_name 
関連する問題