1

Bluetooth デバイスをスキャンし、名前、Mac、およびデバイスが最初と最後に表示された時刻を追跡するスクリプトを作成しようとしています。スキャン間で関連する配列にデータを格納する際に問題が発生しています。

2 回目のスキャンでは、アレイにデータが取り込まれると思っていましたが、そうではありません。そのため、デバイスを初めて見たときのことを知ることができません。問題は、データがグローバルではなくローカルバージョンの配列に保存されていることだと確信していますが、修正方法はわかりません。

これは、非常に基本的なシェル スクリプトを超えた最初の試みであるため、スクリプトの任意の部分に対する提案をいただければ幸いです。私は問題に遭遇したときにグーグルで検索してきましたが、100% 正しくも効率的でもないことをしていることは間違いありません。




    #!/bin/bash

    declare -A bt_name
    declare -A last_seen
    declare -A first_seen

    while [ 1 ] ; do
            echo ""> ../data/bt_host.log
            date=$(date +%s)
            hcitool -i $1 scan| grep -v Scanning | sed "s/\t/$date, /" | sed "s/\t/, /" | while IFS="," read -r time mac name
            do
                    #debug to see if array values are there from last loop
                    echo "PREFILL-mac: $mac first: ${first_seen[$mac]} name: ${bt_name[$mac]} last: ${last_seen[$mac]}"

                    #populate arrays
                    bt_name["$mac"]="$name"
                    last_seen["$mac"]="$time"

                    #test if have seen this device before or not
                    if [[ ! ${first_seen[$mac]} ]]; then
                            first_seen["$mac"]="$time"
                            echo "Setting first"
                    fi

                    #resulting array values
                    echo "POSTFILL-mac: $mac first: ${first_seen[$mac]} name: ${bt_name[$mac]} last: ${last_seen[$mac]}"

            done
            sleep 10
    done

助けてくれてありがとう。

更新:問題が見つかりました(私が尋ねた直後に粗い)。これは、while ループでのプロセス置換の問題です。

に変更しました

    while IFS="," read -r time mac name
    行う
            #echo "$mac、$name、$time"
            echo "PRE-mac: $mac 最初: ${first_seen[$mac]} 名前: ${bt_name[$mac]} 最後: ${last_seen[$mac]}"
            bt_name["$mac"]="$name"
            last_seen["$mac"]="$time"
            もしも [[ !${first_seen[$mac]} ]]; それから
                    first_seen["$mac"]="$time"
                    echo "最初に設定"
            フィ

            echo "POST-mac: $mac 最初: ${first_seen[$mac]} 名前: ${bt_name[$mac]} 最後: ${last_seen[$mac]}"
    終わり

そして、それは問題を解決しました。

人々が持っている他の改善/提案があれば、彼らは大歓迎です。

質問して早々に検索してしまい申し訳ありません。

御時間ありがとうございます。

4

1 に答える 1

2

bash 4.2 では、現在のシェルで最後のコマンドを実行するように要求できます。shopt -s lastpipe

于 2013-02-28T17:49:12.880 に答える