我可以在awk中导入/使用bash函数吗?



我有一个相当大的bash函数库,我在应用程序中使用。库将作为环境文件导入。由于函数已导出,因此我可以在其他 bash 脚本中使用这些函数,而不会出现任何问题。

但是我还有另一个问题,我需要使用 awk 脚本,如果可能的话,我希望能够使用 bash 库中的几个函数。

简而言之,我希望能够做以下两件事之一:

  1. 在 awk 中的 bash 环境文件中使用该函数
  2. 在awk脚本中导入bash环境文件并使用任何变量和/或使用该环境文件导出的函数。

工程:

[root@test@Test1001 scripts]# . mfg.env
[root@test@Test1001 scripts]# set -o posix;OSMAJVER=12 EVMAJVER=11 EVMINVER=1 SYSTEM_ARCH=SSA HOST=test;check_flag RAD
[root@test@Test1001 scripts]# echo $?
0

不起作用:

[root@test@Test1001 scripts]# . mfg.env
[root@test@Test1001 scripts]# awk -v st=ssa -v 'env=OSMAJVER=12 EVMAJVER=11 EVMINVER=1 SYSTEM_ARCH=SSA HOST=test' -f /tmp/s1.awk /tmp/template.mf
bash: check_flag: No such file or directory 127

s1.awk

BEGIN {
  FS=":"
  if (system("set -o posix;"env)!=0) {
    print "***ERROR - ENV string not valid to shell - cannot continue"
    exit 1
  }
}
/^[[:space:]]*#/{next}
/^[[:space:]]*$/{next}
{
  # field 3 processing
  n_a=split($3,a_st,",")
  # field 4 re-glue around ":" if required
  cmd=$4
  for (i=5; i<=NF; i++) cmd=cmd":"$i
  if (cmd) cmd="set -o posix;"env";"cmd
  f=0;for (i=1; i<=n_a && !f; i++) if (a_st[i]==st) f=1
  print "CMD: "cmd
  if ($3=="" || $3=="*" || f)
  system(cmd)
}

MF 文件:

text:S3:rcs,ssa:check_flag RAD

我希望只有在"check_flag RAD"返回 true 时才能够处理上述行。

不,你不能。

您可以使用 export -f 从父 shell 导出函数,然后从 awk 运行另一个 bash 实例作为子进程。然而,这接近黑客的高度;鉴于您实际打算完成的更多细节,我们几乎可以肯定地找到更好的实践方法。

更好的做法是构建您的 awk 脚本以编写您的 shell 原生代码可以从中读取和操作的流 - 请参阅 BashFAQ #1 了解逐字段读取输入流的最佳实践。

相关内容

  • 没有找到相关文章

最新更新