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]}" 終わり
そして、それは問題を解決しました。
人々が持っている他の改善/提案があれば、彼らは大歓迎です。
質問して早々に検索してしまい申し訳ありません。
御時間ありがとうございます。