有什么办法可以在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
eval
。shell不会执行诸如$(rm -rf ~)
输出中的内容awk
。awk
脚本的输出并添加-d ''
到read
命令中来解决此问题)。PATH
,LD_LIBRARY_PATH
或其他对安全敏感的变量。(您可以通过将变量读取到关联数组而不是全局名称空间中,或者在其名称上强制使用前缀来解决此问题)。sh scriptname
(仅保证POSIX功能)运行它。本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句