배쉬가 내 문자열을 먹고 있어요

배쉬가 내 문자열을 먹고 있어요

다음 짧은 프로그램을 고려해 보세요.

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

FWIW는 arduino-serial외부 Arduino에 문자열을 보내고 그 응답을 표준 출력에 반영하는 프로그램입니다.

그래서 저는 이 작은 스크립트가 다음을 생성하길 원합니다:

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

하지만 그것은 생산

--- VERS = 00.01
goodbye

--- B = hello00.01접두사 문자열이 에코되는 대신 "먹히는" 방법을 이해하지 못합니다 .

누군가 무슨 일이 일어나고 있는지, 이 문제를 해결하는 방법을 설명해 줄 수 있나요?

답변1

이것이 캐리지 리턴 라인 종료 문제라고 제안하고 hexdump이론을 테스트하는 방법으로 @AlexP에 제안한 @steeldriver에게 감사드립니다.

문제는 hexdump에서 알 수 있듯이 arduino-serial에서 반환된 문자열에 후행 '\r\n'(즉, 0x0d 0x0a)이 있다는 것입니다.

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

관련 정보