다음 짧은 프로그램을 고려해 보세요.
#!/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