【问题标题】:Bash script doesn't see an array created with AwkBash 脚本看不到使用 awk 创建的数组
【发布时间】:2017-11-01 14:05:27
【问题描述】:

我想在常规文件的每一行中获取一部分。为此,我在脚本中使用了程序 awk。我需要将每个部分放在一个数组中。这样的工作:

declare -i j=1
awk 'BEGIN { FS="|" } { a[j]=$6; ((j++)) }' myFile

但是当我需要使用数组时,我在脚本之后遇到了问题。实际上,脚本的其余行(即该块之外的行)看不到 awk 块中的数组。这个问题怎么解决?

【问题讨论】:

  • 您的数组在 awk 脚本终止后不再存在。 awk 脚本内部和外部的变量j 指的是两个不同的东西。
  • 顺便说一句:虽然((j++)) 也适用于awk,但没有理由将表达式括在括号中(与bash 不同)。

标签: bash variables awk scope scripting


【解决方案1】:

正如Tom Fenech 指出的那样,shell 代码和awk 脚本是独立的世界,具有彼此一无所知的独立变量。
(更一般地说,任何外部实用程序都在 child 进程中运行,因此无法修改调用 shell 的环境。)

为了将awk 输出读入bash 数组,您必须读取awkstdout 输出

在 Bash v4+ 中,您可以执行以下操作:

readarray -t a < <(awk 'BEGIN { FS="|" } { print $6 }' myFile)

这会从 awk 的标准输出中的各个行创建 Bash 数组 "${a[@]}"

注意使用 process substitution (&lt;(...)) 通过标准输入 (&lt;) 向 readline 提供输入,这可确保数组在脚本的其余部分保持在范围内。

【讨论】:

  • @Bento:知道了。另一件值得注意的事情是进程替换不符合 POSIX,因此它们不适用于针对 /bin/sh 而不是 /bin/bash 的脚本。
猜你喜欢
  • 2020-04-03
  • 2011-09-27
  • 2019-01-06
  • 2020-05-06
  • 1970-01-01
  • 1970-01-01
  • 2011-03-07
  • 2022-10-14
  • 2012-10-16
相关资源
最近更新 更多