Parabéns à @steeldriver por sugerir que se tratava de um problema de terminação de linha de retorno de carro e uma dica do chapéu para @AlexP por sugerir hexdump
como uma maneira de validar a teoria.
O problema é que a string retornada pelo arduino-serial tinha um '\ r \ n' à direita (também conhecido como 0x0d 0x0a), conforme evidenciado pelo hexdump:
echo "$VERS" | hexdump -C
00000000 30 30 2e 30 31 0d 0a |00.01..|
Uma possível correção, e a que eu escolhi, é canalizar os resultados por meio de tr -c '\r'
para remover o caractere de retorno, então o script resultante fica assim:
#!/bin/bash
ARDUINO_SERIAL=arduino-serial/arduino-serial
PORT="/dev/cu.usbmodem1421"
VERS=$($ARDUINO_SERIAL -q -b 9600 -p $PORT -S 'V' -e '\r' -r | tr -d '\r')
echo --- VERS = $VERS
B="hello${VERS}goodbye"
echo --- B = $B
que imprime conforme o esperado:
--- VERS = 00.01
--- B = hello00.01goodbye