![bash 正在吃掉我的字符串](https://linux22.com/image/102659/bash%20%E6%AD%A3%E5%9C%A8%E5%90%83%E6%8E%89%E6%88%91%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2.png)
考虑这个简短的程序:
#!/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