将分隔输出读入多个Bash变量

Tys*_*son 5 bash

这应该很简单,我以前在某个地方的脚本中完成它,我找不到我的例子(或等价物),今天这个问题正在驱使我走向疯狂.(即使我没有包含脚本的其余部分,这是在脚本中使用,而不是交互式.)

cat testfile | grep -e eth0
Run Code Online (Sandbox Code Playgroud)

返回:

eth0         123.45.67.8/23                  u/u  Internet - Cable WAN
Run Code Online (Sandbox Code Playgroud)

最终结果是我需要为每个元素设置变量.就好像我是手动完成的那样:

INTF = "etho"
IPADDR = "123.45.67.8/23"
STS = "u/u"
DESC = "Internet - Cable WAN"
Run Code Online (Sandbox Code Playgroud)

我以为我可以这样做:

cat testfile | grep -e eth0 | awk '{print $2}' | xargs read IPADDR
Run Code Online (Sandbox Code Playgroud)

要么

cat testfile | grep -e eth0 | cut -d " " -n2 | read IPADDR
Run Code Online (Sandbox Code Playgroud)

但是我尝试过的任何东西都带来了欢乐......我的路障(头部挡板)是什么?

编辑添加 - 脚本比仅抓取一个IP更复杂,因为我的例子引导人们得出结论.它是一个基于cron的脚本,每分钟运行一次,它通过8个接口运行一个循环,并在某些警报条件下发送消息.当我使用硬编码变量运行它时,脚本的其余部分工作,我只是切断了关于那些让我感到烦恼的部分.

Nic*_*500 4

由于你想设置 4 个变量,而不是执行cut4 次,你可以read这样使用:

#!/bin/bash
#
read INTF IPADDR STS DESC <<< $(cat testfile | grep -e eth0)

echo $INTF
echo $IPADDR
echo $STS
echo $DESC
Run Code Online (Sandbox Code Playgroud)

这将使用默认值“剪切”任何空白$IFS

如果您想从“aaa,bbb,ccc,ddd”中删除值,
您可以更改read.

前任:

IFS="," read INTF IPADDR STS DESC <<< $(cat testfile | grep -e eth0)
Run Code Online (Sandbox Code Playgroud)