Reputation: 171
Requirement:
In a BASH script,
...iterate over an array of environment variable names as shown below:
arr = ('env_var1' 'env_var2' 'env_var3')
and, using jq generate a JSON of environment variable name-value pairs like below:
{
"env_var1": "env_var1_value_is_1",
"env_var2": "env_var2_value_is_2",
"env_var3": "env_var3_value_is_3"
}
Current approach: Using this stackoverflow question's solution as a reference
printf '%s\n' "${arr[@]}" |
xargs -L 1 -I {} jq -sR --arg key {} '{ ($key): . }' | jq -s 'add'
where arr
array contains the environment variable names for which I want the values, however I am unable to interpolate the ${environment_variable_name}
into the JSON's value
in each key-value pair
Upvotes: 3
Views: 1086
Reputation: 116957
Since by assumption the variables referenced in arr
are environment variables,
you could use printf
along the lines of your attempt as follows:
printf '%s\n' "${arr[@]}" | jq -nR '[inputs | {(.): env[.] }] | add'
This also works with gojq
and fq
, and might be useful if your jq does not support $ARGS
Upvotes: 2
Reputation: 240531
How about
jq -n '$ARGS.positional | map({ (.): env[.] }) | add' --args "${arr[@]}"
Using $ARGS.positional
with --args
avoids the need to execute jq once per item in the array, and the env
builtin is the thing you needed to pull values out of the environment.
Upvotes: 3