【问题标题】:Bash Array not accepting WildCardBash Array 不接受通配符
【发布时间】: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


【解决方案1】:

-I 选项只占用一个接口;你需要遍历数组:

for ifc in "${ethernet[@]}"; do
    ping -c 1 -I "$ifc" 172.26.0.1
done

【讨论】:

  • 我不会猜到导致我痛苦的原因所在的 ping 参数! For 循环工作了,谢谢!
【解决方案2】:

使用 xargs:

printf "%s\n" "${ethernet[@]}" | xargs -I {} ping -c 1 -I {} 172.26.0.1

【讨论】:

  • 为什么不%s\0xargs -0?如果你要做一件事,不妨把它做好。 :)
猜你喜欢
  • 1970-01-01
  • 2020-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-20
  • 1970-01-01
  • 2021-10-07
相关资源
最近更新 更多