【发布时间】:2015-09-21 16:38:02
【问题描述】:
我有一个在 bash 脚本中设置的数组。我的目标是通过具有许多网络接口的服务器上的特定端口 ping 通。例如 ping -I eth3 172.26.0.1 命令强制 ping 通过 eth3
当我设置一个 bash 数组时,如果我单独调用元素(端口),我可以让代码工作。例如这里我告诉它 ping Element 2 或 eth5
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) 上消失
ethernet[0]='eth3'
ethernet[1]='eth4'
ethernet[2]='eth5'
ethernet[3]='eth6'
ping -c 1 -I ${ethernet[*]} 172.26.0.1
[13:48:12] shock:/dumps # bash -x ARRAY
+ ethernet[0]=eth3
+ ethernet[1]=eth4
+ ethernet[2]=eth5
+ ethernet[3]=eth6
+ ping -c 1 -I eth3 eth4 eth5 eth6 172.26.0.1
ping: unknown host eth4
关于为什么通配符在数组中的第二个元素上消失的任何想法?我是脚本新手,我真的只是想使用从本文中学到的知识并将其应用于有用的网络脚本。谢谢
http://www.thegeekstuff.com/2010/06/bash-array-tutorial/
编辑 - 我不知道为什么我在这个问题上被否决了。请指教
【问题讨论】:
-
您创建的 ping 命令错误。您需要为每个接口发出单独的 ping 命令。
-
${ethernet[*]}扩展到所有数组元素,如您所见eth3 eth4 eth5 eth6。使用for循环绕过这个for i in ${ethernet[*]}; do ping -c 1 -I $i 172.26.0.1; done -
@NarūnasK 引用变量扩展。尤其是使用
[@]进行数组扩展,以确保它们对于带有空格的值是安全的。 -
如果有教程告诉你使用不带引号的
${name[*]}来扩展数组,我建议立即将其扔进垃圾桶。请参阅 BashFAQ #5 -- mywiki.wooledge.org/BashFAQ/005 -- 及其链接,了解以最佳实践为重点的数组简介。 -
顺便说一句——如果
ping -c 1 -I eth3 eth4 eth5 eth6 172.26.0.1以同样的方式失败,当你在命令行上运行它时以这种方式输入(不涉及数组),你为什么认为这个问题与 shell 有任何关系数组,与ping的命令行语法相比?
标签: linux bash networking centos redhat