How to correctly quote `adb shell su -c` adb shell su -c is a commonly used adb command. Normally you just need to append arguments to the command line like this:

adb shell su -c echo ab


However, things can be tricky if you want to add quotes. For example, to print a  b (there are 2 spaces), these won't work:

adb shell su -c echo "a  b"
adb shell su -c "echo \"a  b\""
adb shell su -c "echo 'a  b'"


You have to use these:

adb shell su -c "\"echo \\\"a  b\\\"\""
adb shell "su -c \"echo \\\"a  b\\\"\""
adb shell su -c "\"echo 'a  b'\""
adb shell "su -c \"echo 'a  b'\""


I'd like to know which is the standard way of writing such a command. Standard means it handles quotes correctly and in the most straightforward way.

My current research:


adb handles command arguments the same way as ssh: Arguments are connected (with space) into a string, and that string is executed.
su -c expects a single string as the command line, and it doesn't do the concatenation for you.


So I think the most standard way of writing adb shell su -c should be like:

adb shell "su -c \"echo \\\"a  b\\\"\""


However, I'm not very confident about this. Does anyone have concrete reference confirming what I'm doing or showing I'm doing it wrong?
The best solution would be to use single-quotes (') around the subcommand:

adb shell 'su -c echo "a  b"'


But please note that usually within single-quotes everything is taken literally and variables are not expanded. This doesn't apply when you nest quotes like this. As an example:

myvar='123'
echo "$myvar"   # prints 123
echo '$myvar'   # prints $myvar


But: (assuming $myvar is set to '123' within the adb shell (e.g. on phone))

adb shell 'su -c echo "$myvar"'    # prints 123


In case you want to use your own shell variables to be included within the adb subcommand, you can simply flip around the quotes:

myvar='test'
adb shell "su -c echo '$myvar'"    # prints test