How to escape quotes in shell?
You can use the following string literal syntax:
> echo $'\'single quote phrase\' "double quote phrase"'
'single quote phrase' "double quote phrase"
From man bash
Words of the form $'string' are treated specially. The word expands to string, with backslash-escaped characters replaced as specified by the ANSI C standard. Backslash escape sequences, if present, are decoded as follows:
\a alert (bell) \b backspace \e \E an escape character \f form feed \n new line \r carriage return \t horizontal tab \v vertical tab \\ backslash \' single quote \" double quote \nnn the eight-bit character whose value is the octal value nnn (one to three digits) \xHH the eight-bit character whose value is the hexadecimal value HH (one or two hex digits) \cx a control-x character
Simple example of escaping quotes in shell:
$ echo 'abc'\''abc'
abc'abc
$ echo "abc"\""abc"
abc"abc
It's done by finishing already opened one ('
), placing escaped one (\'
), then opening another one ('
).
Alternatively:
$ echo 'abc'"'"'abc'
abc'abc
$ echo "abc"'"'"abc"
abc"abc
It's done by finishing already opened one ('
), placing quote in another quote ("'"
), then opening another one ('
).
Related: How to escape single-quotes within single-quoted strings? at stackoverflow SE
In a POSIX shell, assuming in your string there is no variable, command or history expansion, and there is no newline, follow these basic prescriptions:
To quote a generic string with single quotes, perform the following actions:
Substitute any sequence of non-single-quote characters with the same sequence with added leading and trailing single quotes:
'aaa' ==> ''aaa''
Escape with a backslash every preexisting single quote character:
' ==> \'
In particular,''aaa'' ==> \''aaa'\'
To quote a generic string with double quotes, perform the following actions:
Add leading and trailing double quotes:
aaa ==> "aaa"
Escape with a backslash every double quote character and every backslash character:
" ==> \", \ ==> \\
A couple of examples:
''aaa""bbb''ccc\\ddd'' ==> \'\''aaa""bbb'\'\''ccc\\ddd'\'\'
==> "''aaa\"\"bbb''ccc\\\\ddd''"
so that you example could be expanded with the following:
#!/bin/sh
echo \''aaa'\'' "bbb"'
echo "'aaa' \"bbb\""
sudo su enzotib -c 'echo \'\'\''aaa'\''\'\'\'' "bbb"'\'
sudo su enzotib -c 'echo "'\''aaa'\'' \"bbb\""'
sudo su enzotib -c "echo \\''aaa'\\'' \"bbb\"'"
sudo su enzotib -c "echo \"'aaa' \\\"bbb\\\"\""