替换现有BASH脚本中的某些命令

替换现有BASH脚本中的某些命令,bash,shell,tshark,Bash,Shell,Tshark,我有以下脚本,通过OSC发送iwlist扫描结果: #!/bin/bash NUM_BANKS=20 while [[ "$input" != "\e" ]] ; do networks=$(iwlist wlan0 scanning | awk 'BEGIN{ FS="[:=]"; OFS = " " } /ESSID/{ #gsub(/ /,"\\ ",$2) #gsub(/\"/,"",$2) essid[c++]=$2 } /Address/{ gsub

我有以下脚本,通过OSC发送iwlist扫描结果:

#!/bin/bash
NUM_BANKS=20

while [[ "$input" != "\e" ]] ; do

networks=$(iwlist wlan0 scanning | awk 'BEGIN{ FS="[:=]"; OFS = " " }
/ESSID/{ 
    #gsub(/ /,"\\ ",$2)
    #gsub(/\"/,"",$2)
    essid[c++]=$2 
}
/Address/{
 gsub(/.*Address: /,"") 
 address[a++]=$0
}
/Encryption key/{ encryption[d++]=$2 }
/Quality/{ 
gsub(/ dBm  /,"")
signal[b++]=$3 
}
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 "$2" | md5sum | awk '{ print $1 }'| tr '[:lower:]' '[:upper:]'` 
bank=`echo "ibase=16;obase=A; $hash%$NUM_BANKS " | bc`
echo "$1$bank $2 $3 $4"
echo "$1$bank $2 $3 $4" | 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 $1 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($1) }')
        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

如果您提高问题的信噪比,并提供示例输入和输出数据,您获得帮助的机会将大得多。我同意上述评论,但回顾您的历史,再加上uno在您的问题中实际包含了一些代码以及您的持久性。但是我们需要一些样本
tshark
输出和您对该数据的预期输出。祝你好运。这是个好建议,谢谢。我刚刚编辑了这篇文章,提供了原始脚本输出和tshark输出的示例。在变量中添加函数名有点模糊,但我觉得这简化了说明。您可能希望链接一组函数——创建一个名为
command
的函数,该函数在两个数据生成器函数之间切换。建议一种避免时髦的
bc
的方法,只使用Awk。非常感谢您花了三周的时间/精力,以及对脚本的总体整理!实际上,它只打算运行其中一个进程,但是有了这个选项还是不错的。我读得对吗?它当前默认运行tshark_networks部件?不,默认值是
iwlist
,只有在使用选项
--tshark
调用时才会更改。啊,好的,谢谢您的澄清。但是,使用/wlan_扫描打印的变量是否仅由iwlist_网络生成,而不是根据需要由tshark_网络生成?抱歉,如果这有一个明显的答案,只是试图应用我的新手bash知识在这里。