Bash输出到多个变量

时间:2013-09-07 15:07:40

标签: bash

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

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

脚本的输出是:

eth0
wlan0

现在我需要为每个网络接口创建一个变量(将来使用它),但我不知道怎么做,Google也没有帮助我......

4 个答案:

答案 0 :(得分: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字符。这将输出单行的所有数据。然后你只需要没有:字符的第二个单词。这在纯粹的bash中非常简单:

interfaces=()
while read -r _ curInterface _; do
    interfaces+=("${curInterface%:}")
done < <(ip -o link)

答案 1 :(得分:0)

您可以从此输出创建一个数组,并在之后遍历它。

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

您也可以使用这种替代方案redirect output to array

答案 2 :(得分:0)

将输出存储在数组中:

interfaces=( $(ip link | awk '/</ { print $2 }' | awk -F: '!/lo/ {print $1}') )

答案 3 :(得分:0)

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

readarray -t youravar < <(exec ip link | awk -F': ' '/^[0-9]+:/&&!/ lo: /{print $2}')