在awk代码块内修改shell变量

天狼星

有什么办法可以在awk代码块中修改shell变量?

--------- [shell_awk.sh]---------------------
 #!/bin/bash

shell_variable_1=<value A>
shell_variable_2=<value B>
shell_variable_3=<value C>

awk 'function A(X)
{ return X+1 }
{ a=A('$shell_variable_1')
  b=A('$shell_variable_2')
  c=A('$shell_variable_3')
  shell_variable_1=a
  shell_variable_2=b
  shell_variable_3=c
}' FILE.TXT
--------- [shell_awk.sh]---------------------

这是一个非常简单的示例,真实的脚本加载了文件并使用函数进行了一些更改,我需要在更改之前将每个值保留为特定变量,以便可以将MySQL的before和after值注册到MySQL中。

从参数($ 1,$ 2等)接收到after值。

我已经知道如何从文件中获取值之前的值。

除了shell_variable由awk变量设置之外,其他所有操作都做得很好。从awk块代码外部可以轻松设置,但是在内部,可以吗?

查尔斯·达菲

任何程序(使用awk,shell或任何其他语言)都不能直接修改父进程的内存。这包括变量。但是,当然,您awk可以将内容写入stdout,而父外壳程序可以读取该内容并修改自己的变量。


这是awk的示例,该示例将键/值对写出以供bash读取。这并不完美-请阅读以下警告。

#!/bin/bash

shell_variable_1=10
shell_variable_2=20
shell_variable_3=30

run_awk() {
        awk -v shell_variable_1="$shell_variable_1" \
            -v shell_variable_2="$shell_variable_2" \
            -v shell_variable_3="$shell_variable_3" '
        function A(X) { return X+1 }
        { a=A(shell_variable_1)
          b=A(shell_variable_2)
          c=A(shell_variable_3) }
        END {
          print "shell_variable_1=" a
          print "shell_variable_2=" b
          print "shell_variable_3=" c
        }' <<<""
}

while IFS="=" read -r key value; do
        printf -v "$key" '%s' "$value"
done < <(run_awk)

for var in shell_variable_{1,2,3}; do
  printf 'New value for %s is %s\n' "$var" "${!var}"
done

好处

  • 不使用evalshell不会执行诸如$(rm -rf ~)输出中的内容awk

缺点

  • 无法使用换行符处理变量内容。(您可以通过NUL分隔awk脚本的输出并添加-d ''read命令中来解决此问题)。
  • 恶意的awk脚本可以修改PATHLD_LIBRARY_PATH或其他对安全敏感的变量。(您可以通过将变量读取到关联数组而不是全局名称空间中,或者在其名称上强制使用前缀来解决此问题)。
  • 上面的代码使用了bash中也提供的几个ksh扩展;但是,它不能与POSIX sh一起运行。因此,请确保不要通过sh scriptname(仅保证POSIX功能)运行它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

更改 AWK 条件块内的 Shell 脚本变量值

来自分类Dev

AWK:匹配头文件中枚举块内的代码块

来自分类Dev

在awk中的模式内使用shell变量

来自分类Dev

ng-if变量可以在使用它的块内修改吗?

来自分类Dev

在代码块内声明变量时,如何引用代码块外的变量?

来自分类Dev

内聚的代码块

来自分类Dev

Knitr 和父子 R 代码块:子块无法识别循环内的父变量

来自分类Dev

修改函数内的变量

来自分类Dev

awk替代shell变量

来自分类Dev

awk替代shell变量

来自分类Dev

在变量内部存储代码块

来自分类Dev

在静态代码块内访问“ this”

来自分类Dev

linux | awk | shell脚本块删除

来自分类Dev

尝试访问块内的变量

来自分类Dev

在include块内发送变量

来自分类Dev

在include块内发送变量

来自分类Dev

如何在Pug中的脚本标签内的代码块中包含变量

来自分类Dev

评估Kotlin中的代码块(将变量隐藏在范围内)

来自分类Dev

功能代码块不能访问剃刀代码块中的变量?

来自分类Dev

在awk中使用shell变量

来自分类Dev

Shell-Awk-从变量读取

来自分类Dev

shell函数中的awk变量

来自分类Dev

AWK:将shell变量传递给awk

来自分类Dev

循环内的运行时错误 91(对象变量或未设置块变量),但代码在循环外工作

来自分类Dev

AWK 模式代码块语法:如何在 AWK 中按模式运行代码块?

来自分类Dev

在 awk 命令的 END 块内使用 FOR 循环

来自分类Dev

为什么变量在代码块之外可用?

来自分类Dev

代码块中的Sphinx变量替换

来自分类Dev

代码块中最终变量的差异