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

How can I format a json file into a bash environment variable?

我正在尝试获取配置文件的内容(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. 使用 xargs 获取 bashprintf 内置而不是 printf(1) 可执行文件,可能在 /usr/bin/printf(感谢@GordonDavisson):

    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
    
  2. 更简单:如果引用命令,则不必转义命令的输出。就像 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
    

    这使用较新的 $(...) 形式而不是 `...`,因此命令的结果是将 as-is 存储到 pwr_config 变量中的单个单词。*

  3. 更简单:如果您的 npm run start 脚本关心 JSON 中的空格,它根本就坏了:)。只要做:

    pwr_config="$(< config.json)" npm run start
    

    $(<...) returns config.json 的内容。它们都作为单个单词 ("") 存储到 pwr_config、换行符和所有内容中。* 如果出现问题,config.json 中的任何一个都会出错并且应该被修复,或者你的代码 运行 有错误需要被修复。

* 你实际上不需要 $() 周围的 ""。例如,foo=$(echo a b c)foo="$(echo a b c)" 具有相同的效果。但是,我喜欢包含 "" 以提醒自己我特别要求将所有文本放在一起。