16

解释:

我有一个小bash脚本,它只运行任何Linux 命令(例如 say ifconfig

ifconfig的典型输出是这样的:

eth0      Link encap:Ethernet  HWaddr 30:F7:0D:6D:34:CA
          inet addr:10.106.145.12  Bcast:10.106.145.255  Mask:255.255.255.0
          inet6 addr: fe80::32f7:dff:fe6d:34ca/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1104666 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2171 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:444437904 (423.8 MiB)  TX bytes:238380 (232.7 KiB)

lo        Link encap:Local Loopback 
          inet addr:127.0.0.1  Mask:255.255.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:15900 errors:0 dropped:0 overruns:0 frame:0
          TX packets:15900 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:467306 (456.3 KiB)  TX bytes:467306 (456.3 KiB)

现在大多数人通常做的是将整个输出存储到文件/变量中并基于它进行解析。但是,我想知道是否有任何方法可以将输出的特定部分放入多个变量中(例如,在上面的示例中调用一个bash 变量${IPETH0}来携带10.106.145.12来自eth0的 IP 地址并从lo${IPLO}携带 IP 地址而不运行ifconfig 命令两次)。127.0.0.1

类似于tee命令对输入所做的事情,但我想为输出执行此操作并将输出一次存储到 2 个或多个变量中。有任何想法吗?

4

3 回答 3

14
$ read IPETH0 IPLO <<< $(ifconfig | awk '/inet[[:space:]]/ { print $2 }')
$ echo "${IPETH0}"
192.168.23.2
$ echo "${IPLO}"
127.0.0.1

这假定了eth0lo接口的顺序,但它显示了基本思想。

于 2013-08-26T18:21:54.230 回答
4

您可以使用 awk 和 bash 数组:

arr=( $(awk -F ':' '$1 == "inet addr"{sub(/ .*/, "", $2); print $2}' < <(ifconfig)) )

然后你可以这样做:

read IPETH0 IPLO <<< ${arr[@]}
于 2013-08-26T18:19:43.690 回答
3

您可以阅读 ifconfig 的每一行并设置变量:

while read l1 ;do 
   if [[ $l1 =~ inet ]];then     
      set -- $l1 
      echo  "ip is  $2  " 

   fi
done < <(ifconfig)
于 2013-08-26T18:26:41.223 回答