我想在 Bash 中创建一个包含所有活动网络接口的数组。
我设法创建了一个打印它们的 for 循环,但是当我尝试创建数组时,它只包含最后一个lo
接口,而不包含另一个接口。这是我的代码:
#!/bin/bash
for iface in $(ifconfig | cut -d ' ' -f1| tr ':' '\n' | awk NF)
do
printf "$iface%s\n"
declare -a array_test=["$iface"]
done
for i in "${array_test[@]}"; do echo "$i"; done
这是我的输出:
eno1
eno2
eno3
lo
[lo]
另外,如何从数组中排除 lo localhost 接口?
这是一个解决方案,分配列表,然后向其中添加项目:
如果您希望输出每行显示一项:
从输出中删除 localhost:
我的尝试:
bash
将从您提供的任何空格分隔(空格、制表符、换行符)列表中构造一个数组。例如array=(a b c)
。我们可以使用命令替换 ($()
) 来生成这样一个以空格分隔的列表。例如:现在打印出我们刚刚创建的数组:
排除
lo
:如果你真的想使用
ifconfig
而不是ip
,试试这个:ifconfig
仅输出已启动的接口。在 Linux 上,您可以获得目录中的接口列表
/sys/class/net
。因此,使用zsh
,您可以执行以下操作:排除
lo
:只有
up
那些,你可以这样做:或者,假设默认值为
$IFS
.在我的系统上,至少状态为
lo
未知,因此将被排除在外。这也适用于
bash
提供的接口名称不包含通配符。在最新版本的 Linux、IIRC 中,接口名称保证不包含空格制表符和换行符(默认$IFS
),因此不会引起问题。不过,其他 Unicode 空白是允许的,因此 LC_ALL=C 应该保证awk
不会拆分这些空白。ip
如果您对(json 输出)有“-j”支持,那么请使用出色jq
的实用程序;(来自 Kubernetes 节点的示例)