次のショートプログラムを考えてみましょう。
#!/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..|
私が選択した1つの可能な修正は、結果をパイプして戻り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