Avoiding Shell Quote Hell And Managing Interpolation in Nested Quotes:
We’ve all been there. I ran command x, and now I want to run it in the context of command y but I’m dealing with nested strings and it’s a pain. I use this method to quickly avoid all the shell nonsense and escaping. I like to keep my snippets terse, so comments will be inline.
# This creates a method that will read lines into a variable. There's probably a limitation on bash versions, so this may not work on older systems. define(){ IFS='\n' read -r -d '' ${1} || true; } # Given jq, a popular cli json manipulator lets select the animal dog # { # "animals": [ # { # "animal": "dog" # }, # { # "animal": "cat" # } # ] # } ANIMAL=dog define JQ_COMMAND <<EOF jq -r '.animals[] | select( .animal | contains("$ANIMAL"))' EOF # Then, with the previous json object in my paste buffer, we'll simple eval this command pbpaste | eval $JQ_COMMAND # Output: # { # "animal": "dog" # } # This example is contrived, but jq has wonkey stuff going on with quoting and sub quoting because it has its own interpreter. Since we create a here doc, we can pre-interpolate variables and then execute the whole command in line.