Считать имя свойства файла package.json с помощью bash

У меня есть это:

str=`cat package.json`
prop="name"
my_val="$(node -e "console.log(JSON.parse(${str})[${prop}]);")"
echo "$my_val"

Я хочу прочитать name свойство файла package.json. Я думаю, что это близко, но я получаю ошибку JSON.parse:

SyntaxError: Unexpected token o in JSON at position 1
    at Object.parse (native)
    at [eval]:1:18
    at ContextifyScript.Script.runInThisContext (vm.js:25:33)
    at Object.runInThisContext (vm.js:97:38)

Кто-нибудь знает, как это исправить?

Это работает:

prop="name"
my_val="$(node -e "console.log(require('./package.json')['$prop'])")"
echo "json val: '$my_val'"

но мне интересно как это сделать первым способом.

2 ответа

Решение

Вы получаете ошибку синтаксического анализа JSON, потому что вы пытаетесь разобрать строку

"[object Object]"

Вы должны изменить свой bash-скрипт, чтобы иметь:

node -e "console.log(JSON.parse(\`$str\`)['name'])"

Обратите внимание на обратные цитаты! Ваша строка является многострочной строкой.

Вот прогон (в одном из моих каталогов проекта):

$ str=`cat package.json`
$ prop="name"
$ myval="$(node -e "console.log(JSON.parse(\`$str\`)['$prop'])")"
$ echo $myval
plainscript

ДОПОЛНЕНИЕ

В ответ на ФП желающих использовать require вместо вывода содержимого файла в строку решение может быть следующим:

$ prop="name"
$ my_val="$(node -e "console.log(require('./package.json')['$prop'])")"
$ echo $my_val
plainscript

ДОБАВЛЕНИЕ 2

Вы даже можете оставить console.log если вы используете -p:

$ prop="name"
$ my_val="$(node -pe "require('./package.json')['$prop']")"
$ echo $my_val
plainscript

В системе Linux есть команда JQ, которая может анализировать файлы JSON

jq -r ".name" package.json
Другие вопросы по тегам