为什么 awk 不读取 shell 数组?

why is awk not reading a shell array?

我在 awk 中使用 -v 选项读取 shell 数组。但是,它似乎不起作用:

#!/bin/bash

array1=(1 2)

for i in "${array1[@]}"; do
  awk -v vars=${array1[*]} '{for(i=1; i=length(vars); ++i) print vars}'
done

$ ./program
awk: cmd. line:1: fatal: cannot open file `{for(i=1; i=length(vars); ++i) print vars}' for reading (No such file or directory)
awk: cmd. line:1: fatal: cannot open file `{for(i=1; i=length(vars); ++i) print vars}' for reading (No such file or directory)

为什么 awk 似乎试图读取文件,而不是 shell 数组的元素?

更改为:

for i in "${array1[@]}"; do
  awk -v vars="$i" '{for(i=1; i=length(vars); ++i) print vars}' file
done

i 确实包含数组中用于 awk
的数据 awk还需要一个文件来读取。

如果你想将一个 bash 变量传递给 awk 并将其视为一个 awk 数组,你必须将 bash 变量字符串化并拆分它在 awk 中:

array1=(foo bar baz "hello world")
(
    IFS=: 
    awk -v str="${array1[*]}" -v sep="[$IFS]" '
        BEGIN {
            n = split(str, a, sep)
            for (i=1; i<=n; ++i) print i, a[i]
        }
    '
)

(使用括号在子 shell 中本地化对 IFS 的更改)这 输出

1 foo
2 bar
3 baz
4 hello world