I'm trying to substitute a string variable, containing multiple quoted words, as a parameter to a command.
Thus, given the following example script (Note the -x in the shebang, which causes the output to be logged to stderr),
#!/bin/bash -x
myArg="\"hello\" \"world\""
echo "string is:" $myArg
exit
Which gives us,
+ myArg='"hello" "world"'
+ echo 'string is:' '"hello"' '"world"'
string is: "hello" "world"
+ exit
Line two shows what is actually passed to the command; bash has added single quotes to each word in the string. If I instead, thusly, quote "$myArg", the same occurs but for the whole string rather than each word.
Now, imagine that instead of echo
, we are passing the string to a program where some of the arguments need to be quoted patterns, such as "*"
(which mustn't be expanded by the shell).
To clarify, I don't want the single quotes added at all during the expansion. How might I achieve this?
Don't use quotes, use an array (see BashFAQ #050):
$ myArgs=("hello" "world" "multiword arg with * ?")
+ myArgs=("hello" "world" "multiword arg with * ?")
$ echo "${myArgs[@]}"
+ echo hello world 'multiword arg with * ?'
hello world multiword arg with * ?
If it really needs to be in the form of quoted strings within a string, you're either going to have to use something like eval "echo $myArg"
(which can cause some really nasty bugs, if you aren't careful) or parse it yourself (which is going to be difficult).
If you want to pass a variable value as a parameter (99% of cases on SO), simply use proper quoting:
arg="foo bar"
command "$arg"
If you want to pass several arguments, use arrays:
args=("foo bar" "baz ban" bay)
command "${args[@]}"
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With