You are better off using a program like jq to generate the JSON, if you don't know ahead of time if the contents of the variables are properly escaped for inclusion in JSON. Otherwise, you will just end up with invalid JSON for your trouble.

BUCKET_NAME=testbucket
OBJECT_NAME=testworkflow-2.0.1.jar
TARGET_LOCATION=/opt/test/testworkflow-2.0.1.jar

JSON_STRING=BUCKET_NAME" \
                  --arg on "$OBJECT_NAME" \
                  --arg tl "$TARGET_LOCATION" \
                  '{bucketname: $bn, objectname: $on, targetlocation: $tl}' )
Answer from chepner on Stack Overflow
Discussions

Create a Json using bash script - Unix & Linux Stack Exchange
I have a file which has list of cidr's. How can I create a big json with below format using bash script With single CIDR More on unix.stackexchange.com
🌐 unix.stackexchange.com
How do I create JSON file structure and then populate through jq with bash output

I find joy in reading a good book.

More on reddit.com
🌐 r/bash
11
17
April 14, 2021
How to parse and add content to json using bash? - Unix & Linux Stack Exchange
If the array did not previously exist, this would create it with a single element. Also note that jq does not do in-place editing, which means you will need to redirect the output of the above command to a new name and then replace the original file with that new file. Alternatively, use GNU sponge: ... #!/bin/bash file=temp.json ... More on unix.stackexchange.com
🌐 unix.stackexchange.com
January 6, 2023
linux - creating a nested json file from variables using jq - Unix & Linux Stack Exchange
I have a script where I am storing variables and using that I am trying to create a json output to a file. here is my json build format #!/bin/bash JSON_STRING=$(jq -n \ --arg con... More on unix.stackexchange.com
🌐 unix.stackexchange.com
November 8, 2021
Top answer
1 of 4
4

Simply use printf to format the output into JSON

First, you have a very blatant typo in this part of your code right here:

echo "${array[3]:$var-3:4}

Note there is no closing straight quote: ". Fixed it in the rewrite I did below:

But more to the point, doing something like this (using printf) as suggested in this StackOverflow answer. Tested and works in CentOS 7.

#!/bin/bash

readarray -t array <<< "$(df -h)";
var=$(echo "${array[1]}"| grep -aob '%' | grep -oE '[0-9]+');
df_output="${array[3]:$var-3:4}";

manufacturer=$(cat /sys/class/dmi/id/chassis_vendor);
product_name=$(cat /sys/class/dmi/id/product_name);
version=$(cat /sys/class/dmi/id/bios_version);
serial_number=$(cat /sys/class/dmi/id/product_serial);
hostname=$(hostname);
operating_system=$(hostnamectl | grep "Operating System" | cut -d ' ' -f5-);
architecture=$(arch);
processor_name=$(awk -F':' '/^model name/ {print $2}' /proc/cpuinfo | uniq | sed -e 's/^[ \t]*//');
memory$(dmidecode -t 17 | grep "Size.*MB" | awk '{s+=$2} END {print s / 1024"GB"}');
hdd_model=$(cat /sys/block/sda/device/model);
system_main_ip=$(hostname -I);

printf '{"manufacturer":"%s","product_name":"%s","version":"%s","serial_number":"%s","hostname":"%s","operating_system":"%s","architecture":"%s","processor_name":"%s","memory":"%s","hdd_model":"%s","system_main_ip":"%s"}' "$manufacturer" "$product_name" "$version" "$serial_number" "$hostname" "$operating_system" "$architecture" "$processor_name" "$memory" "$hdd_model" "$system_main_ip"

The output I get is this:

{"manufacturer":"Oracle Corporation","product_name":"VirtualBox","version":"VirtualBox","serial_number":"","hostname":"sandbox-centos-7","operating_system":"CentOS Linux 7 (Core)","architecture":"x86_64","processor_name":"Intel(R) Core(TM) i5-1030NG7 CPU @ 1.10GHz","memory":"","hdd_model":"VBOX HARDDISK   ","system_main_ip":"10.0.2.15 192.168.56.20 "}

And if you have jq installed, you can pipe the output of the shell script to jq to “pretty print” the output into some human readable format. Like let’s say your script is named my_script.sh, just pipe it to jq like this:

./my_script.sh | jq

And the output would look like this:

{
  "manufacturer": "Oracle Corporation",
  "product_name": "VirtualBox",
  "version": "VirtualBox",
  "serial_number": "",
  "hostname": "sandbox-centos-7",
  "operating_system": "CentOS Linux 7 (Core)",
  "architecture": "x86_64",
  "processor_name": "Intel(R) Core(TM) i5-1030NG7 CPU @ 1.10GHz",
  "memory": "",
  "hdd_model": "VBOX HARDDISK   ",
  "system_main_ip": "10.0.2.15 192.168.56.20 "
}
2 of 4
1

The following programs can output json:

lshw:

lshw -json

smartmontools v7+:

smartctl --json --all /dev/sda

lsblk:

lsblk --json

lsipc:

lsipc --json

sfdisk

sfdisk --json
🌐
Benjamin Rancourt
benjaminrancourt.ca › blog › how to easily create a json file in bash
How to Easily Create a JSON File in Bash - Benjamin Rancourt
July 12, 2022 - # Obtaining the file in base64 format without any newline to have valid JSON base64=$(base64 "${filename}" --wrap 0) # Obtaining the dimensions of the image width=$(identify -format '%w' "${filename}") height=$(identify -format '%h' "${filename}") # Generating a JSON string (https://stackoverflow.com/a/48470227) json_string=$( jq --null-input \ --arg base64 "${base64}" \ --arg filename "${filename}" \ --arg height "${height}" \ --arg width "${width}" \ '{base64: $base64, filename: $filename, height: $height, width: $width}' ) # Creating the JSON file echo $json_string > "${destination}"
Top answer
1 of 2
1

There are two main issues in your data and code:

  1. You have an input file in DOS or Windows text file format.
  2. Your code creates multiple single-element arrays rather than a single array with multiple elements.

Your input file, lol, appears to be a text file in DOS/Windows format. This means that when a utility that expects a Unix text file as input reads the file, each line will have an additional carriage-return character (\r) at the end.

You should convert the file to Unix text file format. This can be done with e.g. dos2unix.

As for your code, you can avoid the shell loop and let jq read the whole file in one go. This allows you to create a single result array rather than a set of arrays, each with a single object, which your code does.

The following assumes that the only thing that varies between the elements of the top-level array in the result is the source value (there is nothing in the question that explains how the max and min values of the source and destination ports should be picked):

jq -n -R '
        [inputs] |
        map( {
                source: .,
                protocol: "17",
                isStateless: true,
                udpOptions: {
                        sourcePortRange: { min: 521, max: 65535 },
                        destinationPortRange: { min: 1, max: 65535 }
                }
        } )' cidr.txt

or in the same compact one-line form as in your question:

jq -n -R '[inputs]|map({source:.,protocol:"17",isStateless:true,udpOptions:{sourcePortRange:{min:521,max:65535},destinationPortRange:{min:1,max:65535}}})' cidr.txt

Using inputs, jq reads the remaining inputs. Together with -R, it will read each line of cidr.txt as a single string. Putting this in an array with [inputs] we create an array of strings. The map() call takes each string from this array and transforms it into the source value for a larger, otherwise static object.

Add -c to the invocation of jq to get "compact" output.


If you don't want to, or are unable to, convert the input data from DOS to Unix text form, you can remove the carriage-return characters from within the jq expression instead.

To do this, replace the . after source: with (.|rtrimstr("\r")), including the outer parentheses. This trims the carriage-return from the end of each string read from the file.

2 of 2
0

Answer

This should get you the exact syntax you require:

In the example , the file containing your CIDR values is named cidr.txt and appears to contain only IP addresses along with subnets, i.e. other parameters remain constant. If you actually need to change these additional parameters (i.e. the port ranges you provided are not actually the same for all cidr then I will update my answer, and provide a fully fleshed out template)

Additionally, you will require 'jq' , which is the ubiquitous application for dealing with JSON through bash. It may likely already be installed these days, but if not then sudo apt install jq per usual.

while read cidr ; do 
   jq -n --arg CIDR "$cidr" '{"source":$CIDR,"protocol":"17","isStateless":true,"udpOptions": {"destinationPortRange":{"max": 65535,"min": 1},"sourcePortRange": {"min":521,"max": 65535}  }}'  
done < cidr.txt | jq --slurp

Using the four-line file sample you provided, the output of the above will give you the following in the terminal:

[
  {
    "source": "1.1.1.0/22",
    "protocol": "17",
    "isStateless": true,
    "udpOptions": {
      "destinationPortRange": {
        "max": 65535,
        "min": 1
      },
      "sourcePortRange": {
        "min": 521,
        "max": 65535
      }
    }
  },
  {
    "source": "2.2.2.0/24",
    "protocol": "17",
    "isStateless": true,
    "udpOptions": {
      "destinationPortRange": {
        "max": 65535,
        "min": 1
      },
      "sourcePortRange": {
        "min": 521,
        "max": 65535
      }
    }
  },
  {
    "source": "5.5.5.0/21",
    "protocol": "17",
    "isStateless": true,
    "udpOptions": {
      "destinationPortRange": {
        "max": 65535,
        "min": 1
      },
      "sourcePortRange": {
        "min": 521,
        "max": 65535
      }
    }
  },
  {
    "source": "6.6.0.0/16",
    "protocol": "17",
    "isStateless": true,
    "udpOptions": {
      "destinationPortRange": {
        "max": 65535,
        "min": 1
      },
      "sourcePortRange": {
        "min": 521,
        "max": 65535
      }
    }
  }
]


UPDATE

In order to fix the above output, you need to "repair" the line termination of your CIDR file. There are two ways of doing so:

Answer 1:

You can make the following changes to your script

#!/bin/bash

# There are four changes made to the script:
# 1. The addition of `tr` in order to eliminate '\r'.
# 2. Removal of '[' and ']' inside the `jq` command.
# 3. Addition of `jq --slurp` to enforce your specified JSON format. 
# 4. Addition of double-quotes around `$lel` to prevent splitting.

 
lel=$(while read cidr ; do 
       cidr=$(echo "$cidr" | tr -d '\r' );     
       jq -n --arg CIDR "$cidr" '{"source":$CIDR,"protocol":"17","isStateless":true,"udpOptions": {"destinationPortRange":{"max": 65535,"min": 1},"sourcePortRange": {"min":521,
"max": 65535}  }}' 
  done < lol | jq --slurp )
echo "$lel"

Alternative answer

You can "repair" the file containing our list of CIDRs:

cp lol lol_old
cat lol_old | tr -d '\r' > lol

Then, you can use the earlier version of your script, albeit with the corrections explained in #2-4 comments of the script included above.

Explanation

The reason for the \r found in your output is actually found in the formatting of your particular file containing your CIDRs, which happens to follow Windows - and not Unix - line termination standard.

The \r symbol you see in your output is actually present in your source file as well, where it is used along with \n to terminate each individual line. Both \r and \n are invisible characters. The combination of \r\n is known as CRLF - carriage return + line feed - which is a remnant from the age of typewriters, yet for some reason is still used by Windows systems. On the other hand, Unix uses only LF to terminate lines, where it is represented by \n in its escaped form.

To confirm this peciular behavior, you can try executing the following:

head -n 1 lol | xxd -ps 
312e312e312e302f32320d0a

In the above output - the first line of your file converted to its hex form - ends with 0d0a. This HEX combination represent CR+LF. On the other hand, if you execute the following directly inside of your Bash terminal:

echo "abcd"  | xxd -ps
616263640a

you will find that the output follows Unix standard, where the line termination uses simple 0a, i.e. the hex representation of LF.

Note: This line-termination issue is incredibly common, widespread and something one always needs to be on the lookout for operating from inside Unix on files that may have been generated under Windows.



Info regarding jq

The above example (the while read loop) sends its output to the terminal, but you can of course use redirection if you need to store it in a file, using the standard syntax:

while read cidr; do [...] ; done < cidr.txt > outcidr.json

This file will contain the pretty-printed JSON output, but if you need/prefer your output to be contstrained to a single line, you can do:

cat outcidr.json | tr -d '\n' | tr -s ' '

More importantly, if you ever in the future end up with a single-line, complex JSON output that looks impossible to decipher, jq can be used to reformat and pretty-print it`:

echo '[{"source":"1.1.1.0/24","protocol":"17","isStateless":true,"udpOptions":{"destinationPortRange":{"max":55555,"min":10001},"sourcePortRange":{"min":521,"max":65535}}},{"source":"2.2.2.0/24","protocol":"17","isStateless":true,"udpOptions":{"destinationPortRange":{"max":55555,"min":10001},"sourcePortRange":{"min":521,"max":65535}}},{"source":"3.3.3.0/24","protocol":"17","isStateless":true,"udpOptions":{"destinationPortRange":{"max":55555,"min":10001},"sourcePortRange":{"min":521,"max":65535}}}]' > bad_output.json

cat bad_output.json | tr -d '\r' | jq '' 

[
  {
    "source": "1.1.1.0/24",
    "protocol": "17",
    "isStateless": true,
    "udpOptions": {
      "destinationPortRange": {
        "max": 55555,
        "min": 10001
      },
      "sourcePortRange": {
        "min": 521,
        "max": 65535
      }
    }
  },
  {
    "source": "2.2.2.0/24",
    "protocol": "17",
    "isStateless": true,
    "udpOptions": {
      "destinationPortRange": {
        "max": 55555,
        "min": 10001
      },
      "sourcePortRange": {
        "min": 521,
        "max": 65535
      }
    }
  },
  {
    "source": "3.3.3.0/24",
    "protocol": "17",
    "isStateless": true,
    "udpOptions": {
      "destinationPortRange": {
        "max": 55555,
        "min": 10001
      },
      "sourcePortRange": {
        "min": 521,
        "max": 65535
      }
    }
  }
]
# Getting first-order keys for each of the 3 objects 
 
jq '.[] | keys' bad_output.json 

[
  "isStateless",
  "protocol",
  "source",
  "udpOptions"
]
[
  "isStateless",
  "protocol",
  "source",
  "udpOptions"
]
[
  "isStateless",
  "protocol",
  "source",
  "udpOptions"
]

# Getting values corresponding to the selected key"  
jq '.[] | .source ' outcidr.txt 
"1.1.1.0/22"
"2.2.2.0/24"
"5.5.5.0/21"
"6.6.0.0/16"
🌐
Jan-Piet Mens
jpmens.net › 2016 › 03 › 05 › a-shell-command-to-create-json-jo
Jan-Piet Mens :: A shell command to create JSON: jo
March 5, 2016 - A here! script will do it as will a a printf(1), but neither much improve legibility, and if strings contain quotes, it becomes almost impossible to make a script produce JSON. ... Bam! Jo tries to be clever about types and knows null, booleans, strings and numbers. It does arrays, and it pretty-prints on demand: $ jo -p -a spring summer winter [ "spring", "summer", "winter" ] Inspired by a comment on HN, I added another hack: if a key’s value begins with an opening brace ({) or a bracket ([]) we attempt to decode JSON from it; this allows jo to add objects or arrays (use -a!) to itself.
Find elsewhere
🌐
Reddit
reddit.com › r/bash › how do i create json file structure and then populate through jq with bash output
r/bash on Reddit: How do I create JSON file structure and then populate through jq with bash output
April 14, 2021 -

Hi all,

Trying to create the following JSON structure through bash. There will be a max of 4 environments that I want to be shown even if there are no content within them, and example output can be found below the structure. Apologies for the huge post.

Example General Structure:

{
    "ENV":{
        "ENV1":{
            "Middleware": [
                {
                "value1": "",
                "value2": ""
                
            }
        ],
            "System": [
                {
                "value1": "",
                "value2": "",
                "value3": ""
            }
        ],
            "Application": [
                {
                "value1": "",
                "value2": ""
            }
        ], 
            "Utility":[
                {
                "value1": "",
                "value2": "",
                "value3": ""
            }
        ] 
        },
        "ENV2":{
            "Middleware": [
                {
                "value1": "",
                "value2": ""
                
            }
        ],
            "System": [
                {
                "value1": "",
                "value2": "",
                "value3": ""
            }
        ],
            "Application": [
                {
                "value1": "",
                "value2": ""
            }
        ], 
            "Utility":[
                {
                "value1": "",
                "value2": "",
                "value3": ""
            }
        ]
        },
        "ENV3":{
            "Middleware": [
                {
                "value1": "",
                "value2": ""
                
            }
        ],
            "System": [
                {
                "value1": "",
                "value2": "",
                "value3": ""
            }
        ],
            "Application": [
                {
                "value1": "",
                "value2": ""
            }
        ], 
            "Utility":[
                {
                "value1": "",
                "value2": "",
                "value3": ""
            }
        ]
        },
        "ENV4":{
            "Middleware": [
                {
                "value1": "",
                "value2": ""
                
            }
        ],
            "System": [
                {
                "value1": "",
                "value2": "",
                "value3": ""
            }
        ],
            "Application": [
                {
                "value1": "",
                "value2": ""
            }
        ], 
            "Utility":[
                {
                "value1": "",
                "value2": "",
                "value3": ""
            }
        ]
        }
    }
}

Example json output (output.json):

{
    "ENV": {
        "ENV1": {
            "Middleware": [
                {
                    "value1": "Mqwerty",
                    "value2": "Mqwerty"
                },
                {
                    "value1": "Mqwerty",
                    "value2": "Mqwerty"
                },
                {
                    "value1": "Mqwerty",
                    "value2": "Mqwerty"
                }
            ],
            "System": [
                {
                    "value1": "Sqwerty",
                    "value2": "Sqwerty",
                    "value3": "Sqwerty"
                }
            ],
            "Application": [
                {
                    "value1": "Aqwerty",
                    "value2": "Aqwerty"
                },
                {
                    "value1": "Aqwerty",
                    "value2": "Aqwerty"
                }
            ],
            "Utility": [
                {
                    "value1": "Uqwerty",
                    "value2": "Uqwerty",
                    "value3": "Uqwerty"
                }
            ]
        },
        "ENV2": {
            "Middleware": [],
            "System": [],
            "Application": [],
            "Utility": []
        },
        "ENV3": {
            "Middleware": [
                {
                    "value1": "Mqwerty",
                    "value2": "Mqwerty"
                },
                {
                    "value1": "Mqwerty",
                    "value2": "Mqwerty"
                }
            ],
            "System": [],

My input file will look something like this (input.txt):

ENV1,Middleware,Mqwerty,Mqwerty
ENV1,Middleware,Mqwerty,Mqwerty
ENV1,Middleware,Mqwerty,Mqwerty
ENV1,System,Sqwerty,Sqwerty,Sqwerty
ENV1,Application,Aqwerty,Aqwerty
ENV1,Application,Aqwerty,Aqwerty
ENV1,Utility,Uqwerty,Uqwerty,Uqwerty
ENV3,Middleware,Mqwerty,Mqwerty
ENV3,Middleware,Mqwerty,Mqwerty

I would like to use jq to create the aforementioned structure and then populate the json file with the values in the input file. Also, a secondary question is that after the json file is produced, can you edit or partially update certain components of the file? E.g. Changing ENV.ENV1.Middleware[0].value1 from Mqwerty to Cqwerty without recreating the whole file. I'm super confused with using jq, I've tried jq -R -n '(inputs | split(",")) | {"ENV":{(.[0]):""}}'<<<"$fileinput" as a small step towards creating the file, however even that hasn't helped much. Any help would be appreciated.

🌐
Medium
medium.com › @alwaysHopeGood › json-in-shell-script-e6651fab9c88
JSON in Shell Script. Declare shell variable with JSON… | by Rohit | Medium
December 1, 2023 - #!/bin/bash #Create employess data object declare -A employees_data employees_data[status]="success" employees_data[message]="Employee list" employees_data[start]=0 employees_data[total_results]=1 #Create data element Object declare -A data_elem_obj data_elem_obj[empId]=123 data_elem_obj[name]="Tim" data_elem_obj[designation]="Engineer" employees_data[data]= ${data_elem_obj[@]} echo ${data_elem_obj[@]} #output: Tim 123 Engineer echo ${employees_data[@]} #output: 0 success 1 Tim 123 Engineer Employee list · *please remove ‘\n\r’ character before test above bash script, while copy paste. We can parse JSON object with using many tools such as jq, jo, json_pp etc, for more detail please prefer:
🌐
Ask Ubuntu
askubuntu.com › questions › 1409406 › how-to-create-json-with-file-name-size-and-version-in-a-directory
command line - How to create json with file name, size and version in a directory? - Ask Ubuntu
May 19, 2022 - needed json after spliting or before not an issue, there mentioned commands to let know what exactly I want(regarding file version as it's a data inside a file and i thought grep will let know that I'm accessing the data inside a file ) ... #!/bin/bash shopt -s nullglob chunk=1000 for f in *.txt; do size=$(stat -c %s "$f") parts=$(( size / chunk + (size % chunk > 0) )) vers=$(grep -sm1 -Po 'return\s+\K\S+' "$f") printf '["%s",%d,%s,%d]\n' "$f" "$size" "$vers" "$parts" done | jq -n '{"available_files": [inputs]}'
🌐
GitHub
github.com › h4l › json.bash
GitHub - h4l/json.bash: Command-line tool and bash library that creates JSON · GitHub
June 23, 2023 - As with array values, JSON data can be used as values: $ jb user=h4l repo=json.bash >> info $ jb @./info:{:json} {"info":{"user":"h4l","repo":"json.bash"}} $ jb file_types:string[,]=bash,md,hcl year_created:number=2023 >> info $ # The values of the JSON objects are validated to match the argument's type, $ # so the :json type must be used to consume arbitrary JSON $ jb @./info:json{:json} {"info":{"user":"h4l","repo":"json.bash","file_types":["bash","md","hcl"],"year_created":2023}}
Starred by 458 users
Forked by 8 users
Languages   Shell 94.9% | Dockerfile 3.6% | HCL 1.5%
Top answer
1 of 2
2

Assuming you have the correct values in the shell variables label, last_year, and previous_year and that you want to delete all entries in the options array with the value value $previous_year, and add a new entry with the label value $label and value value $last_year.

jq  --arg add_label "$label" \
    --arg add_value "$last_year" \
    --arg del_value "$previous_year" '
    del(.options[]? | select(.value == $del_value)) |
    .options += [{ label: $add_label, value: $add_value }]' file

This correctly combines the two operations in a single invocation of jq.

The command instantiates three internal jq string variables with values taken from the shell variables that you have previously created. Using --arg to create internal string variables from shell variables ensures that the values are correctly encoded (this avoids code injection vulnerabilities).

As in your code, I use .options[]? rather than just .options[] to avoid an error if the options array does not exist. If it does exist, any entry with a value value of $del_value (an internal variable with the value from the shell variable previous_year) is deleted. You tried to select using the label, but I believe this might have been a typo.

The (possibly) modified document is passed on to the next stage, which adds a new element to the options array. If the array did not previously exist, this would create it with a single element.

Also note that jq does not do in-place editing, which means you will need to redirect the output of the above command to a new name and then replace the original file with that new file. Alternatively, use GNU sponge:

jq ...as above... file | sponge file

(Assuming your file is called file.)

2 of 2
0
#!/bin/bash
file=temp.json
now="$(date)"
previous_year=$(date --date="$(date +'%Y') - 1 year" +%Y)
last_year=$((previous_year + 31))
label=$((last_year -2000))
echo "==============================================================================================================="
echo "| Started parsing json file at script at: $file"
echo "| Started at:                             $now"
echo "| previous year is:                       $previous_year"
echo "| last year to be at json array is:       $last_year"
echo "| label assigned to the last year :       $label"
echo "==============================================================================================================="

if cat $file | grep $previous_year
then
  jq --arg key "$previous_year" 'del(.options[] | select(.value == $key))' $file >> new.json
  jq --arg key "$label" --arg val "$last_year" '.options += [{
        "label": $key,
        "value": $val
      }]' new.json >> new2.json
  mv new2.json $file
  rm new.json
  echo "last year found and parsed"  
else
  echo "nothing to be done"
fi

now="$(date)"
echo "==============================================================================================================="
echo "| Ended script at: $now"
echo "==============================================================================================================="
´´´
🌐
DEV Community
dev.to › peter_meszaros_64a5a9137d › jq-build-json-at-bash-script-2h06
JQ - build JSON at bash script - DEV Community
May 16, 2023 - #!/usr/bin/env bash WHAT="something" WHEN="now" JSON=$(jq -n \ --arg what "$WHAT" \ --arg when "$WHEN" \ '$ARGS.named' ) echo "$JSON"
🌐
Letsblogitutkarsh
letsblogitutkarsh.in › 2018 › 01 › how-to-creategenerate-json-file.html
In teaching others we teach ourselves.: How to create/generate a JSON file dynamically using shell script.
January 26, 2018 - Lets name it, generate.sh #!/bin/ash cat > /home/app/secrets/account.json << EOF { "type": $type, "project_id": $project_id, "private_key":$private_key, "client_email":$client_email, "client_id":$client_id, "auth_uri":$auth_uri, "token_uri":$token_uri } EOF And we can now save this file. Where $type,$project_id,$private_key are the environment variables. Now, we can run this shell script by executing the following command in the bash.
🌐
Unix Community
community.unix.com › shell programming and scripting
Building JSON command with bash script - Shell Programming and Scripting - Unix Linux Community
September 17, 2019 - Hello. I'm new to bash script and I'm learning the basics by writing some scripts. Recently a friend of mine asked me if I could try to write a script to him to automate a couple of processes that uses JSON RPCs. I'll try to explain in few words the workflow just to contextualize the problem.