如何将json文件格式化为bash环境变量?
我试图获取配置文件(JSON格式)的内容,去掉无关的新行和空格,使其简洁,然后在启动应用程序之前将其分配给环境变量 到目前为止,我已经做到了:如何将json文件格式化为bash环境变量?,json,bash,shell,printf,xargs,Json,Bash,Shell,Printf,Xargs,我试图获取配置文件(JSON格式)的内容,去掉无关的新行和空格,使其简洁,然后在启动应用程序之前将其分配给环境变量 到目前为止,我已经做到了: pwr_config=`echo "console.log(JSON.stringify(JSON.parse(require('fs').readFileSync(process.argv[2], 'utf-8'))));" | node - config.json | xargs -0 printf '%q\n'` npm run start 这会
pwr_config=`echo "console.log(JSON.stringify(JSON.parse(require('fs').readFileSync(process.argv[2], 'utf-8'))));" | node - config.json | xargs -0 printf '%q\n'` npm run start
这会将一个简短的node.js应用程序导入节点运行时,并获取一个文件名参数,然后对JSON文件进行解析和字符串化,以验证该文件并删除任何不必要的空白。到目前为止还不错
结果通过管道传输到printf,或者至少是这样,但是printf显然不支持这种方式的输入,所以我使用xargs以它支持的方式传递它
我正在使用%q格式化程序来格式化转义任何字符的字符串,这在命令中可能是一个问题,但当通过xargs调用printf时,printf声称它不支持%q。我认为这可能是因为printf有不止一个版本,但我不确定如何解决这个问题
任何帮助都将不胜感激,即使解决方案与我开始的完全不同:)谢谢
更新
以下是我在MacOS上获得的输出:
$ cat config.json | xargs -0 printf %q
printf: illegal format character q
我的JSON文件如下所示:
{
"hue_host": "192.168.1.2",
"hue_username": "myUsername",
"port": 12000,
"player_group_config": [
{
"name": "Family Room",
"player_uuid": "ATVUID",
"hue_group": "3",
"on_events": ["media.play", "media.resume"],
"off_events": ["media.stop", "media.pause"]
},
{
"name": "Lounge",
"player_uuid": "STVUID",
"hue_group": "1",
"on_events": ["media.play", "media.resume"],
"off_events": ["media.stop", "media.pause"]
}
]
}
两种方式:
xargs
拾取bash
的printf
内置文件,而不是printf(1)
可执行文件,可能位于/usr/bin/printf
(感谢@GordonDavisson):
bash
中的echo”“
正常一样,这也应该起作用:
pwr_config="$(echo "console.log(JSON.stringify(JSON.parse(require('fs').readFileSync(process.argv[2], 'utf-8'))));" | node - config.json )" npm run start
这使用了较新的$(…)
形式,而不是`…`
,因此命令的结果是一个单词按原样存储在pwr\u config
变量中*npm run start
脚本关心JSON中的空白,那么它就从根本上被破坏了:)。只要做:
pwr_config="$(< config.json)" npm run start
pwr_config=“$(
$(cat file.json | xargs-0 printf%q
适用于我在debian9上的操作。在使用xargs命令之前,您可以提供更多信息和管道输出示例吗?发布您的json内容并向我们显示所需的确切输出。使用jq
感谢您的帮助!编辑问题以包含所需的信息。所需的输出是JSON文件压缩到一个环境配置字符串中,作为我要运行以执行脚本的命令的一部分…foo=$(jq-c.config.JSON)
?xargs printf
将运行/usr/bin/printf,而不是bash内置版本(因为printf
不是由bash执行,而是由xargs
执行),并且/usr/bin版本通常不支持%q
格式。哇,非常感谢您的回答和大量的简化!太完美了:D
pwr_config="$(< config.json)" npm run start