如何将json文件格式化为bash环境变量?

时间:2019-05-14 08:03:02

标签: 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

这会将简短的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"]
        }
    ]
}

1 个答案:

答案 0 :(得分:1)

两种方式:

  1. 使用xargs内置bash的{​​{1}}而不是printf可执行文件(可能是printf(1)中的可执行文件)(感谢@GordonDavisson ):

    /usr/bin/printf
  2. 更简单:如果引用命令,则不必转义命令的输出。与pwr_config=`echo "console.log(JSON.stringify(JSON.parse(require('fs').readFileSync(process.argv[2], 'utf-8'))));" | node - config.json | xargs -0 bash -c 'printf "%q\n"'` npm run start echo "<|>"中可以确定的方式相同,这也应该起作用:

    bash

    这将使用较新的pwr_config="$(echo "console.log(JSON.stringify(JSON.parse(require('fs').readFileSync(process.argv[2], 'utf-8'))));" | node - config.json )" npm run start 形式而不是$(...),因此命令的结果是将一个单词原样存储在`...`变量中。 * < / sup>

  3. 更简单:如果您的pwr_config脚本关心JSON中的空白,那么它就从根本上被破坏了:)。只要做:

    npm run start

    pwr_config="$(< config.json)" npm run start 返回$(<...)的内容。它们都作为一个单词(config.json)存储到"",换行符和所有行中。 * 如果出现问题,则pwr_config都出错,应该修复,或者您正在运行的代码有错误,需要修复。

*您实际上不需要config.json周围的""。例如$()foo=$(echo a b c)具有相同的效果。但是,我想加入foo="$(echo a b c)"来提醒自己,我是专门要求将所有文本都保留在一起。