#!/bin/bash
#!/bin/bash
# pretend this is something evil -- deleting your home directory or opening a reverse SSH connection
run_an_arbitrary_command() { echo "GOTCHA"; }
set -x
declare -A parms
parms[engine]=\"Sweave\"
parms[verbose]=FALSE
parms[tangle]=TRUE
parms["complex key"]="two words"
## builds $parmstring by concatenating key=value pairs
catarr() {
eval keys=(\"\${!$1[@]}\")
for k in "${keys[@]}"
do
eval val=\${$1[$k]}
parmstring+=", $k=$val"
done
}
parmstring=""
catarr parms
catarr 'foo[@]}"); run_an_arbitrary_command; # '
echo ${parmstring[*]}
IyEvYmluL2Jhc2gKIyEvYmluL2Jhc2gKCiMgcHJldGVuZCB0aGlzIGlzIHNvbWV0aGluZyBldmlsIC0tIGRlbGV0aW5nIHlvdXIgaG9tZSBkaXJlY3Rvcnkgb3Igb3BlbmluZyBhIHJldmVyc2UgU1NIIGNvbm5lY3Rpb24KcnVuX2FuX2FyYml0cmFyeV9jb21tYW5kKCkgeyBlY2hvICJHT1RDSEEiOyB9CgpzZXQgLXgKCmRlY2xhcmUgLUEgcGFybXMKcGFybXNbZW5naW5lXT1cIlN3ZWF2ZVwiCnBhcm1zW3ZlcmJvc2VdPUZBTFNFCnBhcm1zW3RhbmdsZV09VFJVRQpwYXJtc1siY29tcGxleCBrZXkiXT0idHdvIHdvcmRzIgoKIyMgYnVpbGRzICRwYXJtc3RyaW5nIGJ5IGNvbmNhdGVuYXRpbmcga2V5PXZhbHVlIHBhaXJzCmNhdGFycigpIHsKICAgIGV2YWwga2V5cz0oXCJcJHshJDFbQF19XCIpCiAgICBmb3IgayBpbiAiJHtrZXlzW0BdfSIKICAgIGRvCiAgICAgICAgZXZhbCB2YWw9XCR7JDFbJGtdfQogICAgICAgIHBhcm1zdHJpbmcrPSIsICRrPSR2YWwiCiAgICBkb25lCn0KcGFybXN0cmluZz0iIgpjYXRhcnIgcGFybXMKY2F0YXJyICdmb29bQF19Iik7IHJ1bl9hbl9hcmJpdHJhcnlfY29tbWFuZDsgIyAnCgplY2hvICR7cGFybXN0cmluZ1sqXX0K
GOTCHA
, engine="Sweave", verbose=FALSE, tangle=TRUE, complex key=two words
+ declare -A parms
+ parms[engine]='"Sweave"'
+ parms[verbose]=FALSE
+ parms[tangle]=TRUE
+ parms["complex key"]='two words'
+ parmstring=
+ catarr parms
+ eval 'keys=("${!parms[@]}")'
++ keys=("${!parms[@]}")
+ for k in "${keys[@]}"
+ eval 'val=${parms[engine]}'
++ val='"Sweave"'
+ parmstring+=', engine="Sweave"'
+ for k in "${keys[@]}"
+ eval 'val=${parms[verbose]}'
++ val=FALSE
+ parmstring+=', verbose=FALSE'
+ for k in "${keys[@]}"
+ eval 'val=${parms[tangle]}'
++ val=TRUE
+ parmstring+=', tangle=TRUE'
+ for k in "${keys[@]}"
+ eval 'val=${parms[complex' 'key]}'
++ val='two words'
+ parmstring+=', complex key=two words'
+ catarr 'foo[@]}"); run_an_arbitrary_command; # '
+ eval 'keys=("${!foo[@]}");' 'run_an_arbitrary_command;' '#' '[@]}")'
++ keys=("${!foo[@]}")
++ run_an_arbitrary_command
++ echo GOTCHA
+ echo , 'engine="Sweave",' verbose=FALSE, tangle=TRUE, complex key=two words