バッシュは私の文字列を食べています。

バッシュは私の文字列を食べています。

次のショートプログラムを考えてみましょう。

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

関連情報