Different behavior between bash shell and bash script for cmd


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Different behavior between bash shell and bash script for cmd
# 1  
Old 09-19-2018
Different behavior between bash shell and bash script for cmd

So I'm trying to pass certain json elements as env vars and use them later on in a script.


Sample json:
Code:
JSON='{  
    "Element1": "file-123456",
    "Element2": "Name, of, company written in, a very weird way",
    "Element3": "path/to/some/file.txt",
}'


(part of the) script:
Code:
for s in $(echo $JSON | jq "{Element1,Element2,Element3} | to_entries|map(\"\(.key)=\(.value|tostring)\")|.[]");do
export $s
done


The problem I'm having is that Element2 is breaking the line when exporting but if I just run "echo $JSON | jq "{Element1,Element2,Element3} | to_entries|map(\"\(.key)=\(.value|tostring)\")|.[]"" at the cmd line, it looks fine:
Code:
"Element1=file-123456"
    "Element2=Name, of, company written in, a very weird way"
    "Element3=path/to/some/file.txt"


Actual output of script:
Code:
1.bash: line 100: export: `of,': not a valid identifier
1.bash: line 100: export: `company,': not a valid identifier
1.bash: line 100: export: `written,': not a valid identifier


As can be seen, the export command inserts single quotes into the "Element2" and I'm not sure where they come from.


The second variable (Element2) only contains the first element in the string (Name,). The behavior makes sense since the line is broken but for the life in me I cannot understand how or why the export command inserts them.


Any insight is appreciated, thank you!
# 2  
Old 09-19-2018
I don't have jq, to_entries, or any utility starting with map installed on my system so I can't reproduce your output. Nonetheless, the diagnostic output you showed us seems to have a couple of commas that don't match what was in the code you showed us.

If I was guessing at what might be wrong, the first thing I would try would be to run your script with the shell's -x and -v options enabled to get a trace of what it is doing. The second thing I would do would be to change the line in your script that is currently:
Code:
export $s

into:
Code:
export "$s"

so the export command is invoked with one operand instead of nine operands for the Element2 case when <space>s are included in the value you want to assign to that exported variable.
# 3  
Old 09-19-2018
Not pretty, and I've invoked jq twice:
Code:
$ paste -d= <(<<<"$JSON" jq 'keys | .[]') <(<<<"$JSON" jq .[])
"Element1"="file-123456"
"Element2"="Name, of, company written in, a very weird way"
"Element3"="path/to/some/file.txt"

I imagine this will be safe in an eval:
Code:
eval $(paste -d= <(<<<"$JSON" jq 'keys | .[]') <(<<<"$JSON" jq .[]))

Andrew


====
Just checked - couldn't use it in an eval.

Last edited by apmcd47; 09-19-2018 at 07:06 PM..
# 4  
Old 09-20-2018
What I ended up doing was using a piece of code I found on stackoverflow:
Code:
json2keyvalue() {
   echo $JSON | jq -r '{Element1,Element2,Element3} | to_entries|map("\(.key)=\(.value|tostring)")[]'
}

while IFS='=' read -r key value
do
    export "$key"="$value"
done < <(json2keyvalue)


Last edited by da1; 09-20-2018 at 05:44 AM.. Reason: remove diff + sign
This User Gave Thanks to da1 For This Post:
# 5  
Old 09-20-2018
Variables in command arguments should be in "quotes":
Code:
echo "$JSON" | jq ...

Not only that it escapes the shell expansions, it also retains the multi-line structure.
(Unless you NEED everything in one long line.)
These 2 Users Gave Thanks to MadeInGermany For This Post:
# 6  
Old 09-20-2018
I actually had it in quotes but copy pasted the initial code that I ended up adjusting.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

In Bash shell - the ps -ef shows only the /bin/bash but the script name is not displayed

In Bash shell - the ps -ef shows only the /bin/bash but the script name is not displayed ? Is there any way to get the script names for the process command ? --- Post updated at 08:39 AM --- in KSH (Korn Shell), my command output shows the script names but when run in the Bash Shell... (3 Replies)
Discussion started by: i4ismail
3 Replies

2. Shell Programming and Scripting

How to block first bash script until second bash script script launches web server/site?

I'm new to utilities like socat and netcat and I'm not clear if they will do what I need. I have a "compileDeployStartWebServer.sh" script and a "StartBrowser.sh" script that are started by emacs/elisp at the same time in two different processes. I'm using Cygwin bash on Windows 10. My... (3 Replies)
Discussion started by: siegfried
3 Replies

3. UNIX for Advanced & Expert Users

Bash : While Loop behavior

Good Morning I think there may be something I dont understand fully. The following code works well, but I dont like the set domen method. #!/bin/bash # domen="y" while do echo " M A I N - M E N U" echo "1. Contents of /etc/passwd" echo "2. List of users currently logged" echo... (10 Replies)
Discussion started by: popeye
10 Replies

4. UNIX for Dummies Questions & Answers

Im new to bash scriping and i found this expression on a bash script what does this mean.

# check host value regex='^(||1|2|25)(\.(||1|2|25)){3}$' if ')" != "" ]; then if ]; then echo host $host not found exit 4 fi elif ]; then echo $host is an invalid host address exit 5 fi espeacailly the top regex part? ---------- Post updated at 06:58 PM ---------- Previous update was... (1 Reply)
Discussion started by: kevin298
1 Replies

5. UNIX for Advanced & Expert Users

unexpected behavior bash, set -o vi, history -a, and HISTFILE

I am trying to get my history in sync in multiple bash sections and things aren't working the way I expect. Desired behavior, hitting esc-K in all bash sessions (same userid and machine) will use the same history. Observed behavior: Esc-k shows the history of the current session, rather than... (8 Replies)
Discussion started by: gg48gg
8 Replies

6. UNIX for Advanced & Expert Users

Different redirection behavior in BASH/Linux when run under cron vice login ???

run_xfs_fsr is a xfs filesystem maintenance script designed to run under cron. The system is a home theater personal computer running mythbuntu 10.10, and is accessed remotely for these tests. cron runs a script, (xfs_fsr.sh) at 02:30 that runs the subject script under BASH and sets the... (3 Replies)
Discussion started by: keepitsimpleeng
3 Replies

7. Red Hat

BASH command not found strang behavior

Hi all I am relatively new to linux (specifically red hat). I have installed Fedora 13 on my machine and started playing with the terminal when i found a very strange behavior when typing a command that is not found: the terminal does not prompt me back. In other words, i am logged as root (or... (4 Replies)
Discussion started by: abohmeed
4 Replies

8. Shell Programming and Scripting

BASH quoting behavior

The block below isn't a surprise:$ ls file1 file2 file3 $ x=* $ echo $x file1 file2 file3 $ echo '$x' $x $ echo "$x" * $But I found this block a bit bewildering:$ echo $x' >' * $I'm wondering why substitution wasn't performed on the $x, since it was unquoted (as far as I can tell).... (5 Replies)
Discussion started by: na5m
5 Replies

9. Shell Programming and Scripting

how to make your bash script run on a machine with csh and bash

hi, i have a script that runs on bash and would like to run it on a machine that has csh and bash. the default setting on that machine is csh. i dont want to change my code to run it with a csh shell. is there any way i can run the script (written in bash) on this machine? in other words is there... (3 Replies)
Discussion started by: npatwardhan
3 Replies

10. Shell Programming and Scripting

Mimic bash history behavior

Does anyone know of a way to mimic the up arrow/down arrow type bash behavior within a shell script? Say I have a scripted menu, and would like to be able to up arrow to bring up the last X number of lines of user input? Thanks to anybody with a suggestion. :) (0 Replies)
Discussion started by: sysera
0 Replies
Login or Register to Ask a Question