次の属性を含むJSONファイルがあります。
{
"environment": "$USER"
}
jq
以下を使用して値を抽出します。
ENVIRONMENT="$(jq -r '.environment' "properties.json")"
私が望む値はENVIRONMENT
私のユーザー名です。いいえ文字列$USER
- これは可能ですか?
答え1
オプション1:名前でのみ変数を読み取る
bash
変数を参照する変数を持つことができます。たとえば、次のようになります。
REF='USER' # or get it from JSON
echo "${!REF}"
# prints current username
したがって、次のように書くことができます。
ENVIRONMENT_REF="$(jq -r '.environment' "properties.json")"
ENVIRONMENT="${!ENVIRONMENT_REF}"
JSONコンテンツ:
"environment": "USER"
オプション2:フルシェル拡張
他のオプションがより良いかもしれません(しかし絶対に安全ではありません。)以下を使用していますeval
:
ENVIRONMENT="$(eval "echo $(jq -r '.environment' "properties.json")")"
これは安全ではないまた、JSONファイルにマルウェアを挿入する可能性があります。どのマルウェアですか?このファイルを見てみましょうproperties.json
。
{
"environment": "$(rm some_file)"
}
シェルはeval
次のコードを使用します。
echo $(rm some_file)
...指定されたファイルがsome_file
削除されます。ご覧のとおり、そこに入力するコマンドによってはかなり深刻なダメージを与える可能性があります。
答え2
jq
$ENV
Perlの$ENV
ハッシュまたはawkのENVIRON
連想配列に似たオブジェクトを介して環境へのアクセスを提供します。たとえば、(許可された回答からわかるように)Properties.jsonファイルが次のようになるとします。
{
"environment": "USER"
}
それではあなたはできます。
$ environment="$(jq -r '$ENV[.environment]' properties.json)"
$ echo "$environment"
steeldriver
(シェル変数にすべて大文字を使用しないことをお勧めします)。ファイルが次の場合
{
"environment": "$USER"
}
シェル拡張が含まれている場合は、$
それを削除してから同じ方法を使用できます$
。
environment="$(jq -r '$ENV[.environment | sub("^\\$";"")]' properties.json)"
または、外部コマンドを使用して簡単な検索結果を渡すこともできますenvsubst
。
$ environment="$(jq -r '.environment' properties.json | envsubst)"
$ echo "$environment"
steeldriver
答え3
これはぴったりです。 他の答えの一つ。
Linux端末でローカルフォルダを作成します。
$ mkdir -p ~/unix.se/jq/ && cd ~/unix.se/jq/
ファイルの作成properties.json
:
$ echo '{"environment":"USER"}'>properties.json && cat properties.json
{"environment":"USER"}
PS - 良い形式jq
:
$ jq '.' properties.json
{
"environment": "USER"
}
JSONキー値を使用してenvironment
新しい環境変数を設定し、その内容を表示します。1
$ JQ_USER=$(jq -r '$ENV[.environment]' properties.json) && echo $JQ_USER
tedly
これまでは大丈夫でしたが、問題は私が嘘をついてきたということです。 (!) - ファイルが
properties.json
正しくないようです。かなり前述のように、前には次のようなドル記号があるからですUSER
。
$ echo '{"environment":"$USER"}'>properties.json && cat properties.json
{"environment":"$USER"}
邪魔になるドル記号を削除すると(たとえば、空の文字列に置き換える)、すでに機能しているソリューションに戻ることができます。
$ JQ_USER=$(jq -r '$ENV[.environment | sub("\\$";"")]' properties.json)
echo $JQ_USER
tedly
1このプログラムを初めて実行したときに終了するメッセージを受け取りました
jq: error: ENV/0 is not defined at <top-level>
。$ENV[]
バージョン 1.6 が必要(またはそれ以降)jq
。
答え4
1つのアプローチは次のとおりです。
ENVIRONMENT=$(printenv $(jq -r '.environment' properties.json |
cut -c2-))