I have the following json:
{
"Parameters": {
"AmiId": "/my/image/id/latest",
"InstanceType": "t3.medium",
"Environment": "$ENV_DEFINITION"
}
}
And I have exported the $ENV_DEFINITION
with the value dev
.
NOTE: I want to keep the literal value $ENV_DEFINTION
if the environment variable is not set. That's why I'm using the // .
part when accessing the env[]
array in the command below.
I need to obtain the following output:
'AmiId=/my/image/id/latest' 'InstanceType=t3.medium' 'Environment=dev'
I'm able to get the above output witht he following jq
command:
jq -r '[ .Parameters | to_entries[] | .value |= (env[.[1:]] // .) | [.key, .value] | join("=") ] | @sh' < myfile.json
But then I needed to add a few more parameters to json:
{
"Parameters": {
"AmiId": "/my/image/id/latest",
"InstanceType": "t3.medium",
"Environment": "$ENV_DEFINITION",
"MinSize": 0,
"MaxSize": 0,
"DesiredCapacity": 0,
}
}
And jq
started to fail with the following message:
jq: error (at myfile:10): Cannot index number with object
Well, looks like it fails when the json values are integer as it cannont index integer values at the following place: env[.[1:]]
.
Then I came up with this new jq
command:
jq -r '[ .Parameters | to_entries[] | select((.value|tostring)|startswith("$")) |= (env[.[1:]] // .) | [.key, .value] | join("=") ] | @sh' < myfile.json
But now, this fail when trying to replace the $ENV_DEFINITION
. If I take it out of the json file, the above command works.
The error message is:
jq: error (at myfile.json:5): Cannot index object with object
I have tried the following
jq -r '[ .Parameters | to_entries[] | .value |= if ((.value|tostring)|startswith("$")) then (env[.[1:]] // .) else . end | [.key, .value] | join("=") ]' < myfile.json
But:
jq: error (at myfile.json:5): Cannot index string with string "value"
I'm still fighting with jq
and it's documentation here to figure out what to do but any help will be welcome.
To only trigger the lookup if the value is a string, you can use select(type == "string")
, which also has the strings
shortcut. So, in your first attempt, just replace .[1:]
with strings[1:]
, and you should be good to go.
jq -r '[ .Parameters | to_entries[] | .value |= (env[strings[1:]] // .) | [.key, .value] | join("=") ] | @sh' < myfile.json