1

我正在 Bash 中创建一个脚本来更改我 PC 的所有 MAC 地址。我可以用这个列出所有网络接口:

ip link | grep "<" | cut -d " " -f 2 | cut -d ":" -f 1 | grep -v lo

脚本的输出是:

eth0
wlan0

现在我需要为每个网络接口创建一个变量(以供将来使用),但我不知道如何,谷歌也没有帮助我......

4

4 回答 4

3

回答:

readarray -t interfaces < <(ip link | grep "<" | cut -d " " -f 2 | cut -d ":" -f 1 | grep -v lo)

echo "${interfaces[0]}" # prints eth0
echo "${interfaces[1]}" # prints wlan0


并循环使用它们for

for curInterface in "${interfaces[@]}"; do
    echo "$curInterface"
done



但是有更好的方法来解析数据:

首先,<您可以使用-o标志来代替 grepping 字符。这将在单行上输出所有数据。然后你只需要没有:字符的第二个单词。这在纯 bash 中非常简单:

interfaces=()
while read -r _ curInterface _; do
    interfaces+=("${curInterface%:}")
done < <(ip -o link)
于 2013-09-07T15:10:46.890 回答
0

您可以从此输出创建一个数组,然后循环遍历它。

my_array=( $(ip link | grep "<" | cut -d " " -f 2 | cut -d ":" -f 1 | grep -v lo) )

您也可以这个例子给出不同的选择将输出重定向到数组

于 2013-09-07T15:10:52.890 回答
0

将输出存储在数组中:

interfaces=( $(ip link | awk '/</ { print $2 }' | awk -F: '!/lo/ {print $1}') )
于 2013-09-07T15:10:54.113 回答
0

我可以用一个 awk 命令让它变得更简单:

readarray -t youravar < <(exec ip link | awk -F': ' '/^[0-9]+:/&&!/ lo: /{print $2}')
于 2013-09-07T15:28:32.437 回答