如何将变量从 awk 传递到 bash?我想传递很多变量,所以我不使用:
x=$(awk '.....)
我认为它没什么用。
答案1
假设您信任 awk 正在处理的传入数据。
您可以让 awk 打印出 shell 变量声明,并且source
awk 的输出就像是一个 shell 文件:
source <(
awk '
# ....
print "var1=" value1
print "var2=" value2
# ....
' input
)
echo "shell var1 = $var1"
echo "shell var2 = $var2"
答案2
这是一个普遍问题,在 StackExchange 上已经多次出现过,例如
- https://stackoverflow.com/questions/496702/can-a-shell-script-set-environment-variables-of-the-calling-shell
- https://stackoverflow.com/questions/263005/is-it-possible-to-change-the-environment-of-a-parent-process-in-python
- https://serverfault.com/questions/37796/how-to-export-vars-from-a-subshell-to-a-parent-shell
答案始终是,一个进程不可能改变其父进程的环境(而这正是当您要求在awk
生成它的 shell 中设置环境变量时试图实现的)。
通常建议的解决方案是获取输出,正如 Glenn 所展示的那样。不过,你必须信任该程序。你基本上是在执行任意代码。
另一个略有不同的解决方案是将var=value
行输出到命名文件,然后改为执行该文件的 source 命令。(执行 source 命令基本上是在当前 shell 中执行文件的内容,就像您输入它们一样;请参阅http://ss64.com/bash/source.html) 这种方法的优点是您可以在获取文件之前检查其内容。