在对不同的解决方案进行了许多小时的测试之后,我还没有找到一个可行的解决方案。Bash和Shell脚本不是我最擅长的领域。
我有一个变量,它有行(新行)和列(选项卡分开)。我想做的是循环遍历行,得到‘列X’,然后将该项放入变量中,这样我就可以使用该单元格来做一些事情了。例如,回音。
有一个未知的行数,但已知的列数,因此可以始终得到列3例如。
我正在Linux上运行Bashv.4。
示例输入(无法找到一种方法在这里实际“标签”事物?);
UniqueID1 -tab- Description -tab- FriendlyNameABC
UniqueID1 -tab- Description -tab- FriendlyNameXYZ示例输出将是循环遍历清单,获取FriendlyNameABC (col 3)并将其回显出来。
我试图在这里扩展这个脚本,https://www.raspberrypi.org/forums/viewtopic.php?f=63&t=77277&p=1178478#p1178478 --它是一个通过WPS连接到WiFi的shell脚本。该页面上提供的脚本(下面供参考)可以工作,但它只依赖于选择最强的WiFi信号,这并不总是要连接到的网络。
#!/bin/bash
# only run if there's no current wifi connection
if ! ifconfig wlan0 | grep -q "inet addr:" ; then
# grab AP's that support WPS, sort by strength and select the strongest
wpa_cli scan_results | grep WPS | sort -r -k3 | awk 'END{print $NF}' >/tmp/wifi
read ssid < /tmp/wifi
wpa_cli wps-pbc $ssid
fi目前,我已经设法修改了上面的脚本,使以“wpa_cli.”开头的行现在阅读如下,它将整个已识别的WiFi网络放入一个变量中,但是接下来我很难将所有这些都分离出来。
wpa_cli scan_results | grep WPS | sort -r -k3 $allConnections在本质上,上面的代码我需要翻译成这个伪代码;
#!/bin/bash
# only run if there's no current wifi connection
if ! ifconfig wlan0 | grep -q "inet addr:" ; then
# grab AP's that support WPS, sort by strength and select the strongest
wpa_cli scan_results | grep WPS | sort -r -k3 | awk 'END{print $NF}' >/tmp/wifi
read ssid < /tmp/wifi
#This is the section below that I'm struggling to implement (this is pseudo code, the only bit of working code is the line starting with wpa_cli...)
while(ssid.hasNext(){
#Try connecting to the network
wpa_cli wps-pbc $ssid
if(successful){break();}
}
fi我应该补充一下,我假设数据是制表符,并根据运行命令时布局的外观来分隔新行;
wpa_cli scan_results在Linux命令行运行命令时,是否有确认分隔符的方法?
发布于 2017-06-23 14:42:27
简单永远是赢家。我已经解决了这个问题。人们的帮助,评论,谢谢,因为这帮助我澄清了一些事情,同时测试各种脚本。
在对所有的数据进行测试之后,很明显的是,数据发布的方式并不完全正确。空格被视为制表符,这意味着您想要连接的SSID网络名称,当它应该是“”时,它将被简单地称为" Network“,这样就不会连接,因为没有称为" network”的网络。因此,在删除了几乎所有的代码并简化了所有的事情之后,我从之前的测试中记得,您实际上不需要提供一个网络名称,您可以简单地运行命令,而不需要任何更聪明的逻辑,这可以简化一切。
#!/bin/bash
# only run if there's no current wifi connection
if ! ifconfig wlan0 | grep -q "inet addr:" ; then
wpa_cli wps-pbc
fi您会注意到,在上面,这个脚本只是监听一个WPS按钮被按下,并将连接到该网络自动。不管这是否是最强的信号,或者这个网络名称中是否有一个空格。
发布于 2017-06-23 13:05:05
如果“每个单元格”的逻辑足够简单,则可以执行以下操作:
echo $VARIABLE | cut -f3 -d$'\t' | xargs echo
# echo $VARIABLE | # pipe the value of VARIABLE to the next statement...
# cut -f3 -d$'\t' | # take the 3rd column, using tabs for the delimiters
# xargs echo # for each resulting row, call `echo` with that row as the argument如果你需要做一些更复杂的事情:
for CELL in $(echo $VARIABLE | cut -f3 -d$'\t'); do # for each line in the result of this command...
echo $CELL
# Other stuff with $CELL
done发布于 2017-06-23 21:51:26
首先,花点时间思考一下echo $a和echo "$a"之间的区别。
在第一种情况下,a的值作为单独的字段给echo,在第二种情况下给出1字段。因此,在第一种情况下,bash将更改制表符和换行符,删除可能在$a中的任何行和列。
用4行填充a的一个棘手方法是为printf提供更多的参数,而不是格式字符串中所需的参数:
a=$(printf "%s\t%s\t%s\n" 1 a A 2 b B 3 c C 4 "F o u r" "4 4 4 4" )在printf之后,echo可能会让您大吃一惊:
you> echo $a | sed -r 's/\t/<tab>/g'
1 a A 2 b B 3 c C 4 F o u r 4 4 4 4
you> echo "$a" | sed -r 's/\t/<tab>/g'
1<tab>a<tab>A
2<tab>b<tab>B
3<tab>c<tab>C
4<tab>F o u r<tab>4 4 4 4您可以根据a的值创建一个循环,将每个字段分配给不同的变量,下面的示例切换字段如下:
you> while IFS=$'\t' read -r id desc friend; do
echo "$id = ${friend} (${desc})"
done <<< "$a"
1 = A (a)
2 = B (b)
3 = C (c)
4 = 4 4 4 4 (F o u r)我不明白这句话
wpa_cli scan_results | grep WPS | sort -r -k3 $allConnections当您想对grep结果排序时,应该删除(或空) $allConnections。当var allConnections填充文件名时,可以使用> $allConnections (重定向到文件),但我认为您希望将结果存储在var中。allConnections=$(wpa_cli scan_results \ grep,WPS,WPS,排序-r -k3),现在您可以做类似的事情
while IFS=$'\t' read -r id desc friend; do
echo "Trying ssid ${id} = ${friend} (${desc})"
wpa_cli wps-pbc ${id} && break
done <<< "$allConnections"&& break假定,wpa_cli成功时返回0。
https://stackoverflow.com/questions/44722052
复制相似问题