I love bash's -x option for exactly this type of debugging. It prints out every command before running it, so you can see what is different about the command as the script is running it
bash -x my-script.sh
Off the top of my head, I'm guessing the inline shell command $( ... ) is eating your double quotes, and I bet you should escape them, particularly around username and password
Thanks for the suggestion. I already tried this: echo-ed the curl command to stdout and then in the shell copied it and pasted it to run it. From the script I get "000", from the shell I get "200".
Exit code 7 means curl couldn't connect to the host, so I would try just curling a URL you know is valid directly, not setting it as an env var, to see what happens then.
I verified that the USERNAME, PASSWORD, and URL vars are being passed to the subshell.
But are they being passed into the script? Normal behavior would be for variables to propagate to subshells but not to scripts/commands, unless you explicitly export them (e.g. export USERNAME='my_username' instead of just USERNAME='my_username'). Is that what's happening here?
Another possibility is that when the script runs, it is run with a different shell, like sh or zsh. Does your script have a #! line at the top, and is it pointing to the same version of bash you are running in Terminal?
If you run echo $PATH; which curl in the script vs directly in your Terminal, do they output the same results? This is a bit of an edge case, but I've been stymied before by having multiple versions of curl installed (e.g. via homebrew and via my distro) and different PATHs in different contexts causing unexpected behavior.