如何使用Bash编写JSON文件?

21

我希望使用BASH编写JSON文件,但似乎不太顺利...

我的代码:

sudo echo -e "Name of your app?\n"
sudo read appname
sudo cat "{apps:[{name:\"${appname}\",script:\"./cms/bin/www\",watch:false}]}" > process.json

问题: -bash: process.json: 拒绝访问


1
你检查过在指定位置创建文件的权限了吗? - Hemant Metalia
1
第一行和第二行的 sudo echosudo read 对我来说看起来毫无意义。 - Tom Fenech
当我运行 sudo vim process.json 时,它可以正常工作... - tonymx227
vim 打开文件;使用 > process.jsonshellsudo 实际运行之前打开文件。 - chepner
可能是从Bash脚本输出JSON的重复问题。 - jww
2个回答

31

一般而言,不要这样做。使用已经知道如何正确引用值的工具,比如 jq

jq -n --arg appname "$appname" '{apps: [ {name: $appname, script: "./cms/bin/www", watch: false}]}' > process.json

话虽如此,你目前的问题是sudo仅适用于命令而非重定向。一种解决方法是使用tee来代替直接写入文件。

echo '{...}' | sudo tee process.json > /dev/null

1
无法将其作为编辑,因为这需要至少6个字符,但是false}]}后面的反引号应该替换为标准引号才能正常工作: jq -n --arg appname "$appname" '{apps: [ {name: $appname, script: "./cms/bin/www", watch: false}]}' > process.json - datapug
谢谢,现在已修复。 - chepner

12

为了输出文本,应该使用echo而不是cat(后者输出来自文件或流的数据)。

除此之外,如果你希望在结果中显示双引号,你还需要转义文本中的双引号。

echo -e "Name of your app?\n"
read appname
echo "{apps:[{name:\"${appname}\",script:\"./cms/bin/www\",watch:false}]}" > process.json

如果你需要处理的不仅仅是一个简单的行,请参考@chepner的建议,使用JSON工具,例如jq

你遇到的-bash: process.json: Permission denied错误是因为你无法向process.json文件写入内容。如果文件不存在,请检查你的用户在该目录上是否具有写权限。如果文件存在,请检查你的用户是否具有对该文件的写权限。


这个有教程吗? - Noel Harris
@NoelHarris 是关于什么的?jq、bash、bash中的引用? - Aaron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接