bash 函数内变量创建的行为

bash 函数内变量创建的行为

我正在使用下面的函数来增加外部脚本。其主要目的只是从 ifconfig 和 ping 测试输出返回一些数据。我试图使用变量将它们设置在同一个函数中,只是为了执行一些其他“管道”并将它们与其他信息再次连接起来。但我得到了这种行为。基本上,我想做的是:

    > for i in $(ifconfig | grep "inet addr" | tr -s " " | cut -d" " -f 3 | cut -d: -f2) ; do ping -c1 $i | grep packet | a=`echo $i-$(cut -d,
    -f3)` | echo $a; done  
4  
4  
4  
4

如您所见,每次迭代都会返回数字 4。

如果我只是删除变量归因,我会得到我期望首先在变量“a”中设置的输出:

> for i in $(ifconfig | grep "inet addr" | tr -s " " | cut -d" " -f 3 | cut -d: -f2) ; do ping -c1 $i | grep packet | echo $i-$(cut -d, -f3); done
10.0.2.15- 0% packet loss
192.168.0.2- 0% packet loss
10.0.2.100- 0% packet loss
127.0.0.1- 0% packet loss
  • 为什么我在第一个函数代码执行中得到数字 4 作为输出?
  • 如何在同一函数内设置变量并在某些管道后再次回显它?那可能吗?

此致 !

答案1

 for i in $(...) ; do ... | a=`...` | echo $a; done

为什么我在第一个函数代码执行中得到数字 4 作为输出?

因为a=`...`echo $a是在不同的子shell/子进程中执行的。a=1; a=3 | echo $a1在任何 shell 中打印。无法将变量从子 shell 传递到其父 shell。

如何在同一函数内设置变量并在某些管道后再次回显它?那可能吗?

不可以。除非您在主脚本中、管道之前设置它。

答案2

如果您使用重组管道的最后一部分,sed我认为您可以获得您想要的东西。该脚本匹配整个标准输入,并将其替换为后跟的sed值和输出的第三个字段(来自标准输入)。例如,$i-ping

$ for i in $(ifconfig | grep "inet addr" | tr -s " " | cut -d" " -f3 | cut -d: -f2); do \
    ping -c1 $i | grep packet | cut -d, -f3 | sed "s/\(.*\)/$i - \\1/"; \
done
123.145.167.189 -  0% packet loss
127.0.0.1 -  0% packet loss

相关内容