替换现有 BASH 脚本中的一些命令
replacing some commands in an existing BASH script
我有以下脚本,它通过 OSC 发送 iwlist 扫描的结果:
#!/bin/bash
NUM_BANKS=20
while [[ "$input" != "\e" ]] ; do
networks=$(iwlist wlan0 scanning | awk 'BEGIN{ FS="[:=]"; OFS = " " }
/ESSID/{
#gsub(/ /,"\ ",)
#gsub(/\"/,"",)
essid[c++]=
}
/Address/{
gsub(/.*Address: /,"")
address[a++]=[=11=]
}
/Encryption key/{ encryption[d++]= }
/Quality/{
gsub(/ dBm /,"")
signal[b++]=
}
END {
for( c in essid ) { print "/wlan_scan ",essid[c],signal[c],encryption[c] }
}'
)
read -t 0.1 input
echo "$networks" | while read network; do
set $network
hash=` echo "" | md5sum | awk '{ print }'| tr '[:lower:]' '[:upper:]'`
bank=`echo "ibase=16;obase=A; $hash%$NUM_BANKS " | bc`
echo "$bank "
echo "$bank " | sendOSC -h localhost 9997
done
#echo "$networks" | sendOSC -h localhost 9997
done
此输出的示例是“/wlan_scan13 BTHomehub757 -85 On”,然后通过 sendOSC 程序发送。
我基本上需要用这个tshark扫描的结果替换iwlist扫描数据:
sudo tshark -I -i en1 -T fields -e wlan.sa_resolved -e wlan_mgt.ssid -e radiotap.dbm_antsignal type mgt subtype probe
类似地输出两个字符串和一个 int,输出结果如下:
'Hewlett-_91:fa:xx EE-BrightBox-mjmxxx -78'.
所以最终我希望脚本在这个
实例中给我一个输出
'/wlan13 Hewlett-_91:fa:xx EE-BrightBox-mjmxxx -78'.
两次扫描都会以大致相同的速率不断生成这种格式的结果,并在检测到新的 wifi 路由器时进行更新,并且这些结果会在通过 sendOSC 程序到达后立即发送出去。
对于有经验的编码人员来说,这可能是一个非常简单的编辑,但我已经尝试解决这个问题好几天了,我想我应该寻求帮助!
如果有人能阐明什么需要留下以及什么需要离开这里,我将不胜感激。
非常感谢。
您真的要替换命令吗?理智的方法似乎是向脚本添加一个选项以指定将哪段代码添加到 运行,并将它们都包括在内。
# TODO: replace with proper option parsing
case in
--tshark) command=tshark_networks; shift;;
*) command=iwlist_networks;;
esac
tshark_networks () {
sudo tshark -I -i en1 -T fields \
-e wlan.sa_resolved \
-e wlan_mgt.ssid \
-e radiotap.dbm_antsignal type mgt subtype probe
}
iwlist_networks () {
iwlist wlan0 scanning | awk .... long Awk script here ....
}
while [[ "$input" != "\e" ]] ; do
networks=$($command)
read -t 0.1 input
echo "$networks" | while read network; do
: the rest as before, except fix your indentation
这也有一个很好的副作用,那就是可怕的 iwlist
命令被封装在它自己的函数中,在主循环之外。
...嗯,事实上,我可能会将主循环重构为
while true; do
$command |
while read a b c d; do
hash=$(echo "$b" | md5sum | awk '{ print toupper() }')
bank=$(echo "ibase=16;obase=A; $hash%$NUM_BANKS " | bc)
echo "$a$bank $b $c $d"
echo "$a$bank $b $c $d" | sendOSC -h localhost 9997
done
read -t 0.1 input
case $input in '\e') break;; esac
done
我有以下脚本,它通过 OSC 发送 iwlist 扫描的结果:
#!/bin/bash
NUM_BANKS=20
while [[ "$input" != "\e" ]] ; do
networks=$(iwlist wlan0 scanning | awk 'BEGIN{ FS="[:=]"; OFS = " " }
/ESSID/{
#gsub(/ /,"\ ",)
#gsub(/\"/,"",)
essid[c++]=
}
/Address/{
gsub(/.*Address: /,"")
address[a++]=[=11=]
}
/Encryption key/{ encryption[d++]= }
/Quality/{
gsub(/ dBm /,"")
signal[b++]=
}
END {
for( c in essid ) { print "/wlan_scan ",essid[c],signal[c],encryption[c] }
}'
)
read -t 0.1 input
echo "$networks" | while read network; do
set $network
hash=` echo "" | md5sum | awk '{ print }'| tr '[:lower:]' '[:upper:]'`
bank=`echo "ibase=16;obase=A; $hash%$NUM_BANKS " | bc`
echo "$bank "
echo "$bank " | sendOSC -h localhost 9997
done
#echo "$networks" | sendOSC -h localhost 9997
done
此输出的示例是“/wlan_scan13 BTHomehub757 -85 On”,然后通过 sendOSC 程序发送。
我基本上需要用这个tshark扫描的结果替换iwlist扫描数据:
sudo tshark -I -i en1 -T fields -e wlan.sa_resolved -e wlan_mgt.ssid -e radiotap.dbm_antsignal type mgt subtype probe
类似地输出两个字符串和一个 int,输出结果如下:
'Hewlett-_91:fa:xx EE-BrightBox-mjmxxx -78'.
所以最终我希望脚本在这个
实例中给我一个输出'/wlan13 Hewlett-_91:fa:xx EE-BrightBox-mjmxxx -78'.
两次扫描都会以大致相同的速率不断生成这种格式的结果,并在检测到新的 wifi 路由器时进行更新,并且这些结果会在通过 sendOSC 程序到达后立即发送出去。
对于有经验的编码人员来说,这可能是一个非常简单的编辑,但我已经尝试解决这个问题好几天了,我想我应该寻求帮助!
如果有人能阐明什么需要留下以及什么需要离开这里,我将不胜感激。
非常感谢。
您真的要替换命令吗?理智的方法似乎是向脚本添加一个选项以指定将哪段代码添加到 运行,并将它们都包括在内。
# TODO: replace with proper option parsing
case in
--tshark) command=tshark_networks; shift;;
*) command=iwlist_networks;;
esac
tshark_networks () {
sudo tshark -I -i en1 -T fields \
-e wlan.sa_resolved \
-e wlan_mgt.ssid \
-e radiotap.dbm_antsignal type mgt subtype probe
}
iwlist_networks () {
iwlist wlan0 scanning | awk .... long Awk script here ....
}
while [[ "$input" != "\e" ]] ; do
networks=$($command)
read -t 0.1 input
echo "$networks" | while read network; do
: the rest as before, except fix your indentation
这也有一个很好的副作用,那就是可怕的 iwlist
命令被封装在它自己的函数中,在主循环之外。
...嗯,事实上,我可能会将主循环重构为
while true; do
$command |
while read a b c d; do
hash=$(echo "$b" | md5sum | awk '{ print toupper() }')
bank=$(echo "ibase=16;obase=A; $hash%$NUM_BANKS " | bc)
echo "$a$bank $b $c $d"
echo "$a$bank $b $c $d" | sendOSC -h localhost 9997
done
read -t 0.1 input
case $input in '\e') break;; esac
done