bash 正在吃掉我的字符串

bash 正在吃掉我的字符串

考虑这个简短的程序:

#!/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)
echo --- VERS = $VERS
B="hello${VERS}goodbye"
echo --- B = $B

FWIWarduino-serial是一个将字符串发送到外部 arduino 并将其响应回显到标准输出的程序。

所以我希望这个小脚本能够产生:

--- VERS = 00.01
--- B = hello00.01goodbye

但它却产生了

--- VERS = 00.01
goodbye

我不明白前缀字符串--- B = hello00.01是如何被“吃掉”而不是回显的。

有人可以解释发生了什么事以及如何解决这个问题吗?

答案1

完全感谢 @steeldriver 提出这是一个回车行终止问题,并向 @AlexP 提出建议hexdump作为验证理论的一种方式。

问题是 arduino-serial 返回的字符串有一个尾随 '\r\n' (又名 0x0d 0x0a),如 hexdump 所证明的:

echo "$VERS" | hexdump -C
00000000  30 30 2e 30 31 0d 0a                              |00.01..|

我选择的一种可能的修复方法是通过管道传输结果tr -c '\r'以去掉返回字符,因此生成的脚本如下所示:

#!/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

按预期打印:

--- VERS = 00.01
--- B = hello00.01goodbye

相关内容