私はAndroidのデバッグブリッジを介して私のAndroidデバイスのすべてのパーティションをダンプするスクリプトを書くのが好きです。これは時間のかかるプロセスなので、特定の主要なイベントの後にメッセージをエコーして、ユーザーに進捗状況を通知したいと思います。驚いたことに、echo
すべての文字が正しく印刷されない場合があることを発見しました。
エラーを再現するための最小サンプルは次のとおりです。
#!/bin/bash
targets=$(adb shell "ls /dev/block/nand*")
for item in $targets; do
echo "Processing $item"
echo "dd if=$item bs=4M"
done
これにより、次のような出力が生成されます。
Processing /dev/block/nanda
dd if=/dev/block/nanda bs=4M
Processing /dev/block/nandd
dd if=/dev/block/nandd bs=4M
Processing /dev/block/nandg
dd if=/dev/block/nandg bs=4M
Processing /dev/block/nandj
bs=4M/dev/block/nandj
Processing /dev/block/nandb
dd if=/dev/block/nandb bs=4M
Processing /dev/block/nande
dd if=/dev/block/nande bs=4M
Processing /dev/block/nandh
bs=4M/dev/block/nandh
Processing /dev/block/nandc
dd if=/dev/block/nandc bs=4M
Processing /dev/block/nandf
dd if=/dev/block/nandf bs=4M
Processing /dev/block/nandi
bs=4M/dev/block/nandi
なぜこれが起こり、どのように解決するのですか?
答え1
キャリッジリターンで終わると、カーソルはすぐに$item
行の先頭に戻って印刷されます。<space>bs=4M
あなたはできますitem=${item%$'\r'}