![](/img/trans.png)
[英]>> Store / Capture stdout and stderr in different variables/ in an array (bash)
[英]Capture output of a bash command, parse it and store into different bash variables
说明:
我有一个小的bash脚本,它只运行任何 Linux命令(例如说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)
现在大多数人通常会将整个输出存储到文件/变量中并根据它进行解析。 然而,我想知道是否有可能将输出的特定部分放在多个变量中(比如一个名为${IPETH0}
的bash变量来从eth0携带IP地址10.106.145.12
并且${IPLO}
携带在上面的示例中,来自lo的IP地址127.0.0.1
没有运行ifconfig命令两次 )。
类似于tee命令对输入执行的操作,但我想为输出执行此操作并将输出一次性存储到2个或更多变量中。 有任何想法吗?
$ read IPETH0 IPLO <<< $(ifconfig | awk '/inet[[:space:]]/ { print $2 }')
$ echo "${IPETH0}"
192.168.23.2
$ echo "${IPLO}"
127.0.0.1
这假定了eth0
和lo
接口的顺序,但它显示了基本思想。
您可以使用awk和bash数组:
arr=( $(awk -F ':' '$1 == "inet addr"{sub(/ .*/, "", $2); print $2}' < <(ifconfig)) )
然后你可以这样做:
read IPETH0 IPLO <<< ${arr[@]}
你可以读取ifconfig的每一行并设置变量:
while read l1 ;do
if [[ $l1 =~ inet ]];then
set -- $l1
echo "ip is $2 "
fi
done < <(ifconfig)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.