0

我有一个 BASH 脚本,我想要获取附近无线网络的所有 SSID,并将它们输出到用户可以选择的菜单中。我有列出网络的部分,它们显示在菜单中,生成的 SSID 保存到变量中。

问题是,当任何网络的名称中有空格时,列表就会变得混乱。带有空格的 SSID 在whiptail 菜单中被拆分为多个条目。例如,“Test Networks Network”将是 3 个条目。任何解决此问题的帮助,将不胜感激。


有问题的代码如下所示。您会注意到我手动将“其他”添加到列表中,以便稍后手动输入 SSID。

wifiNetworkList="$(iwlist wlan0 scan | grep ESSID | awk -F \" '{print $2 ; print $2}')"
wifiNetworkList+=' Other Other'
wifiSSID=$(whiptail --notags --backtitle "PiAssist" --menu "Select WiFi Network" 20 80 10 $wifiNetworkList 3>&1 1>&2 2>&3)

最终解决方案

wifiNetworkList=()  # declare list array to be built up
ssidList=$(iwlist wlan0 scan | grep ESSID | sed 's/.*:"//;s/"//') # get list of available SSIDs
while read -r line; do
    wifiNetworkList+=("$line" "$line") # append each SSID to the wifiNetworkList array
done <<< "$ssidList" # feed in the ssidList to the while loop
wifiNetworkList+=(other other) # append an "other" option to the wifiNetworkList array
wifiSSID=$(whiptail --notags --backtitle "PiAssist" --menu "Select WiFi Network" 20 80 10 "${wifiNetworkList[@]}" 3>&1 1>&2 2>&3) # display whiptail menu listing out available SSIDs

我在代码中包含了注释,以帮助解释遇到同样问题的人会发生什么。需要注意的关键事项之一是,当我们将 wifiNetworkList 提供给whiptail 时,我们必须在它周围加上引号,这给了我们"${wifiNetworkList[@]}".

4

1 回答 1

1

与其使用各种引用来构建字符串,不如使用数组更容易。您基本上正在使用相同的对,有时在单个条目中有空格。

我不能用空格重现输入,但从它的角度来看,grep它可以用:

% echo 'ESSID:"net one"\nESSID:"net2"'
ESSID:"net one"
ESSID:"net2"

我将在 Zsh 中展示其余部分,因为它的数组处理(不拆分单词)更干净,如果 Zsh 不适合您,您可以将其移植到 Bash。

这会将每个 esside放入一个数组中两次。

% l=()  # declare list array to be built up
% print 'ESSID:"net one"\nESSID:"net2"' |
    while read line; do e=$(sed 's/.*:"//;s/"//' <<<$line); l+=($e $e); done

添加other两次:

% l+=(other other)

你可以看到它l现在是一个有用的配对形式:

% print -l $l     
net one
net one
net2
net2
other
other

现在whiptail就像你所做的那样调用是一件简单的事情:

% wifiSSID=$(whiptail --notags --backtitle "PiAssist" --menu "Select WiFi Network" 20 80 10 $l)

在此处输入图像描述

于 2015-07-26T16:26:46.687 回答