Shell – How to echo an expression with both single and double quotes

echoquotingshell

I have tried many things, but I'm new to the shell. Is it possible to have both double and single quotes within an echo?

I want to generate echo "scan 'LPV',{FILTER => "(PrefixFilter ('MP1-Eq1')"}" for system call, but I am getting an error because of the mutiple double and single quotes.

ftable="echo" " \"" "scan" " " "'LPV',{FILTER => " "\"" "\(" "PrefixFilter ""\(""'MP1-Eq1'" "\)" "\"" "\}" "\" "    
echo "scan 'LPV',{FILTER => "(PrefixFilter ('MP1-Eq1')"}"
bash: syntax error near unexpected token `('

How can I write scan 'LPV',{FILTER => "(PrefixFilter ('MP1-Eq1')"}? The syntax is hbase's and I can't change it…

EDIT

I want to call echo within system call.

ftable="echo "scan 'LPV',{FILTER => "(PrefixFilter ('MP1-Eq1')"}" "
system(ftable)
error

I have tried with $ but

ftable="echo $'scan" "\'" "LPV" "\'" ",{FILTER => " "\"" "(PrefixFilter (" "\'" "MP1-Eq1" "\'" ")" "\"" "}' '"
system(ftable)
error

Getting an error because of double quote.

Best Answer

In bash:

echo $'scan \'LPV\',{FILTER => "(PrefixFilter (\'MP1-Eq1\')"}'

or

echo "scan 'LPV',{FILTER => \"(PrefixFilter ('MP1-Eq1')\"}'"

For longer strings this may be a more convinient alternative:

> cat <<EOT
scan 'LPV',{FILTER => "(PrefixFilter ('MP1-Eq1')"}
EOT

with EOT or \EOT, depending on whether parameter expansion and quote removal (backslash) are intended or not.

Usage within awk

Defining this string within awk would make everything even more complex. This should be done outside awk in the shell:

ftable=$'echo "scan \'LPV\',{FILTER => "(PrefixFilter (\'MP1-Eq1\')"}"'
# echo "$ftable"
awk -v ftable="$ftable" '... system(ftable); ...'
Related Question