我遇到了一个问题,我的命令单独运行时是有效的,但是当与jq一起使用时,命令export test=test就不起作用了,但如果我只运行export test=test,它是有效的。
所以我有一个名为test.json的文件,内容如下:
{ "test":"test124","url":"google.com"}
所以我使用了这个命令:
jq -r 'to_entries | .[] | "export \(.key)=\(.value)"' test.json | sh
我检查了环境变量,但是什么也没有看到。
我尝试了这个命令:
jq -r 'to_entries | .[] | "\(.key)=\(.value)"' test.json | while IFS='=' read -r key value; do export "$key=$value"; ; done
问题依旧。
但如果我使用这个命令,它是有效的:
export test=$(jq -r .test test.json)
但我想要循环执行。
谢谢帮助。
解决方案: 缺少$(...)
$(jq -r 'to_entries | .[] | "export \(.key)=\(.value)"' test.json)
你最初尝试中的主要问题是你在其他环境中设置了环境变量(在第一种情况下是启动的
sh
shell的环境,在另一种情况下是运行while
循环的子shell的环境)。当那个shell或子shell终止时,环境和你的变量就会被移除。给定一个简单的JSON文件,像这样:
...我们可以创建一个shell脚本片段,将每个键导出为具有给定(解码后的)字符串值的环境变量:
或者,稍微短一点,
jq
中的@sh
运算符会尝试用给定的字符串做正确的事情,生成一个希望有效的带引号的shell字符串。以我上面的例子JSON文档为例,这将生成
这可以在shell中使用
eval
进行评估(注意双引号的命令替换;我们需要保留来自jq
的输出中的空格):然后...
请注意,这不会检查变量名的有效性。但是,它支持包含换行符的变量,并且还会保留其他空格字符。
尽管如此,你可以构造无法在所有区域设置中转换为shell中有效字符串值的JSON字符串,而且这种方法通常存在安全问题。参见例如Stéphane Chazelas的相关回答:
https://unix.stackexchange.com/a/681375/116858