
Bashスクリプトがあり、z = "y = x"の形式の文字列を分離して、値が "x"の環境変数をeval $z
作成するために使用できるようにしています。y
これは私のコードです。
xxx=$(terraform state show aws_s3_bucket.prod_bucket | grep website_endpoint | sed 's/ //g')
echo $xxx
>>>website_endpoint="my-site.s3-website-us-east-1.amazonaws.com"
eval $xxx
>>>-bash: website_endpoint=my-site.s3-website-us-east-1.amazonaws.com: command not found
このコードの失敗による混乱は、ファイルの内容を.env
作業環境変数に変換するのと非常によく似た作業を実行することです。
cmd=$(sed -ne '/^#/d; /^export / {p;d}; /.*=/ s/^/export / p' .env)
eval $cmd ### works!
なぜ後者は機能し、前者は機能しないのですか?
編集:これで問題はbashではなくterraformにあることを確認したので、それを反映するようにタイトルを変更しました。
答え1
さて、これがどこに行くのか知っています。デフォルトではterraform state show
、コマンドには色、太字などのエスケープ文字が含まれます。残念ながら、これらの文字は端末にまったく表示されません。奇妙なことに、実際に何でも印刷するたびに目に見える効果が消えるように見えるからです!私の場合、$ xxxは次のようになります。
[1m[0mwebsite_endpoint[0m[0m="magnus-misc-v2.s3-website-us-east-1.amazonaws.com"
...[0m
すべての書式と色を削除すると、ジャズが私の曲を台無しにするという視覚的な手がかりはありませんeval
。だから私の解決策はそのterraform state show -no-color
フラグを使用することでした。実際にはbashの問題ではありませんが、terraform CLIには混乱する問題があります。
答え2
次を表す文字列があるたびにひも変数の割り当ては、この割り当てを実行する安全で簡単な方法ですdeclare
。より多くの引用を使用™):
$ xxx='website_endpoint="my-site.s3-website-us-east-1.amazonaws.com"'
$ declare "$xxx"
$ echo "$website_endpoint"
"my-site.s3-website-us-east-1.amazonaws.com"