Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Bash数组不接受通配符_Linux_Bash_Networking_Centos_Redhat - Fatal编程技术网

Linux Bash数组不接受通配符

Linux 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

我在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]} 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