使用 printf 格式化数组的输出

car*_*cal 4 array shell-script printf

我有一个数组,其中包含有关每个 NIC 的详细信息。每个数组索引由三个空格分隔的值组成。

我想要一个漂亮的表格作为输出。有没有办法为索引中的每个值分配格式模式?

到目前为止,这是我使用的:

NIC_details[0]='wlp2s0 192.168.1.221 xx:xx:xx:xx:xx:xx'
NIC_details[1]='wwan0 none xx:xx:xx:xx:xx:xx'
NIC_details[2]='virbr0 192.168.122.1 00:00:00:00:00:00'

printf "%-20s\n" "${NIC_details[@]}"
Run Code Online (Sandbox Code Playgroud)

有没有办法通过位置 $1、$2 和 $3 访问数组索引中的值,知道它们是空格分隔的,然后为每个 $X 位置应用格式模式?

我也试过

echo "$i" | column -t
Run Code Online (Sandbox Code Playgroud)

但它并没有带来预期的结果。

Jef*_*ler 5

这是对您已经在做的事情的轻微修改:

set -f # to prevent filename expansion
for i in ${!NIC_index[@]}
do
  printf "%-20s" ${NIC_details[i]}
  printf "\n"
done
Run Code Online (Sandbox Code Playgroud)

我添加了一个for循环来遍历所有数组索引——这就是${!NIC...语法。由于它是一个数字数组,您也可以直接在索引上循环。

请注意,我故意不加${NIC_details[i]} 引号,以便 shell 会在您用来分隔值的空格上拆分值。printf因此看到 3 个值,因此对每个值重复 %-20s 格式。然后我在每个 NIC 之后添加一个换行符以制作一个漂亮的表格。

set -f,如果我们离开不带引号的变量,在顶部是重要的; 否则,shell 将介入并尝试将它在未加引号的变量中看到的任何通配符进行glob

示例输出:

wlp2s0              192.168.1.221       xx:xx:xx:xx:xx:xx
wwan0               none                xx:xx:xx:xx:xx:xx
virbr0              192.168.122.1       00:00:00:00:00:00
Run Code Online (Sandbox Code Playgroud)