Linux Bash数组不接受通配符
我在bash脚本中设置了一个数组。我的目标是通过具有许多网络接口的服务器上的特定端口ping。例如,ping-I eth3 172.26.0.1命令强制ping通过eth3 当我设置bash数组时,如果我单独调用元素(端口),我可以让代码工作。例如,这里我告诉它ping元素2或eth5Linux Bash数组不接受通配符,linux,bash,networking,centos,redhat,Linux,Bash,Networking,Centos,Redhat,我在bash脚本中设置了一个数组。我的目标是通过具有许多网络接口的服务器上的特定端口ping。例如,ping-I eth3 172.26.0.1命令强制ping通过eth3 当我设置bash数组时,如果我单独调用元素(端口),我可以让代码工作。例如,这里我告诉它ping元素2或eth5 ethernet[0]='eth3' ethernet[1]='eth4' ethernet[2]='eth5' ethernet[3]='eth6' ping -c 1 -I ${ethernet[2]} 1
ethernet[0]='eth3'
ethernet[1]='eth4'
ethernet[2]='eth5'
ethernet[3]='eth6'
ping -c 1 -I ${ethernet[2]} 172.26.0.1
脚本通过eth2工作并ping
[13:49:35] shock:/dumps # bash -x ARRAY
+ ethernet[0]=eth3
+ ethernet[1]=eth4
+ ethernet[2]=eth5
+ ethernet[3]=eth6
+ ping -c 1 -I eth5 172.26.0.1
PING 172.26.0.1 (172.26.0.1) from 172.26.0.192 eth5: 56(84) bytes of data.
From 172.26.0.192 icmp_seq=1 Destination Host Unreachable
--- 172.26.0.1 ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 3001ms
但是,如果我使用通配符而不仅仅是元素2,它将在第二个元素(Eth4)上消失
你有没有想过,为什么通配符会在数组中的第二个元素上消失?我对脚本编写还不熟悉,我只是在尝试使用从本文中学到的知识,并将其应用到一个有用的网络脚本中。谢谢
编辑-我不知道为什么我在这个问题上被否决了。请注意,
-I
选项只需要一个接口;您需要在阵列上循环:
for ifc in "${ethernet[@]}"; do
ping -c 1 -I "$ifc" 172.26.0.1
done
使用xargs:
printf "%s\n" "${ethernet[@]}" | xargs -I {} ping -c 1 -I {} 172.26.0.1
您正在创建的ping命令错误。您需要为每个接口发出单独的ping命令。
${ethernet[*]}
扩展到所有数组元素,如您所见eth3 eth4 eth5 eth6
。对${ethernet[*]}中的i使用for
循环绕过这个for;do ping-C1-I$I 172.26.0.1;完成
@NarūnasK引用变量扩展。特别是带有[@]
的数组扩展,以确保带有空格的值的安全。如果任何教程告诉您使用不带引号的${name[*]}
来扩展数组,我建议立即将其扔进垃圾箱。请参见BashFAQ#5---及其链接,了解关于阵列的介绍,重点是最佳实践。顺便说一句,如果ping-c1-I eth3 eth4 eth5 eth6 172.26.0.1以同样的方式失败,那么当您在以这种方式键入的命令行上运行它(不涉及阵列)时,您认为这个问题与shell阵列有什么关系,vs使用命令行语法执行ping
?为什么不%s\0
和xargs-0
?如果你要做一件事,不妨把它做好我也不会猜到我痛苦的原因在哪里!For循环成功了,谢谢!
printf "%s\n" "${ethernet[@]}" | xargs -I {} ping -c 1 -I {} 172.26.0.1