adb está adicionando um retorno de carro (também conhecido como 0x0d , Ctrl-M , \r , etc) antes da linha de alimentação. Provavelmente, para facilidade de uso com o software Windows, que espera que as linhas terminem com CR-LF, em vez de apenas LF.
Você mesmo pode ver isso com hexdump aka hd , por exemplo:
$ printf "$R" | hd
00000000 30 0d |0.|
00000002
Porque você só precisa retornar um único valor (o código de saída). você pode usar printf em vez de echo e redirecionar toda a saída de ls para /dev/null no dispositivo Android para evitar a impressão de novas linhas (então, o adb não adiciona um CR):
R="$(adb shell 'ls /mnt/ > /dev/null 2>&1 ; printf $?')"
Se o seu dispositivo Android não tiver printf ou se você precisar retornar uma ou mais linhas de saída de um shell do Android, poderá usar tr -d '\r' ou dos2unix ou sed 's/\r$//' ou semelhante a tira o CR.
dos2unix e sed são melhores opções do que tr aqui, porque eles apenas removerão CRs que são imediatamente seguidos por LF, deixando apenas CRs que possam estar em outro lugar em uma linha:
$ R="$(adb shell 'ls /mnt/ > /dev/null 2>&1 ; echo $?' | dos2unix)"
$ printf "$R" | hd
00000000 30 |0|
00000001