【发布时间】:2018-07-23 15:10:32
【问题描述】:
所以,我正在尝试导出一个来自返回 json 值的 api 的环境变量。想使用 jq 只做一个衬里,但如果值有空格我无法让它工作
尝试不将值括在引号中
/app/src $ $(echo '{"params":[{ "Name":"KEY","Value":"value with space"}]}' | jq
-r '.params[] | "export " + .Name + "=" + .Value')
/app/src $ printenv KEY
value
/app/src $
接下来,我尝试将值用引号括起来
/app/src $ $(echo '{"params":[{ "Name":"KEY","Value":"value with space"}]}' | jq
-r '.params[] | "export " + .Name + "=\"" + .Value + "\""')
sh: export: space": bad variable name
/app/src $
【问题讨论】:
-
颤抖。这里有龙,我所说的“龙”是指“外壳注入漏洞”。请参阅BashFAQ #50,了解为什么不带引号的扩展无法生成带空格的 shell 命令。
-
@CharlesDuffy 是的,我明白,我只是希望有一个解决方法。我永远不会使用一些公共 api 或未知 json 来做这件事,但这一切都来自我们的内部网络私有凭证存储。
-
上下文是什么?通常,更好的做法是将 JSON 键/值对加载到 bash 中的关联数组中——这样你就不必担心覆盖对 shell 本身有意义的名称(并且全大写键使其成为特定的危险)。
-
顺便说一句,更好的形式是
foo=bar; export foo而不是export foo=bar,这样我们只是使用简单的赋值而不是调用单独的命令(是的,它是内置的,但在解析器级别,它被视为命令)。不幸的是,我们在这里需要后一种形式,因为jq转义名称的方式会阻止它们被视为赋值(它的输出看起来像'foo'='bar',并且引用名称的任何部分都会阻止shell从看到一个作业)。
标签: bash environment-variables jq