オプション1:名前でのみ変数を読み取る

オプション1:名前でのみ変数を読み取る

次の属性を含む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$ENVPerlの$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-))

関連情報