用Bash编写JSON文件的最有效方法是什么?

该用户需要帮助

因此,我必须使用bash脚本编写一个JSON文件,并且我知道我可以做一些类似的事情echo 'something' >> $file来缓慢地构建文件,但是回声重定向而不是实际的文件输出似乎有点“ hacky”。如果那是最好的方法,而不是一点都不怪癖,我很乐意使用,echo,但是我只是想知道是否有更好的方法可以从bash脚本输出文件。

查尔斯·达菲

有效地产生输出

echo是内置命令,而不是外部命令,因此它的效率没有您想像的那么低。什么低效的是把>> filename每个月底echo

这是不好的:

# EVIL!
echo "something" >file
echo "first line" >>file
echo "second line" >>file

这很好:

# NOT EVIL!
{
  echo "something" >&3
  printf '%s\n' "first line" "$second line" >&3
  # ... etc ...
} 3>file

...仅打开输出文件一次,从而消除了主要的效率低下的情况。

需要明确的是:调用echo20次比调用cat一次要有效得多,因为调用cat是外部过程,而不是外壳程序的一部分。运行echo "foo" >>file20次非常低效的是打开和关闭输出文件20次。不是echo它本身。


正确生成JSON

不要使用catechoprintf,或其他任何东西的那种。相反,请使用能够理解JSON的工具-任何其他方法都会导致潜在的错误结果(甚至可能通过注入攻击加以利用)。

例如:

jq \
  --arg something "$some_value_here" \
  --arg another "$another_value" \
  '.["something"]=$something | .["another_value"]=$another' \
  <template.json >output.json

...将基于生成一个JSON文件,template.jsonsomething设置为shell变量中的值,"$some_value_here"another_value设置为第二个值。与幼稚的方法不同,这将正确处理包含文字引号或其他必须转义以正确表示的字符的变量值。


除了回声

上面提到的所有内容echo都应避免-偏爱于此printf(使用适当的静态格式字符串)。根据POSIX sh标准

应用用途

除非所有-n(作为第一个参数)和转义序列都被省略,否则不可能在所有POSIX系统上移植使用echo。

可以移植printf实用程序来模拟echo实用程序的任何传统行为,如下所示(假定IFS具有其标准值或未设置):

[...]

鼓励新的应用程序使用printf代替echo。

理据

由于回声实用程序在历史应用中的广泛使用,因此尚未过时。希望不带s进行提示或可能期望回显-n的合格应用程序,应使用从第九版系统派生的printf实用程序。

按照指定的方式,echo以最简单的方式写入其参数。回声的两个不同的历史版本以致命的不兼容方式变化。

BSD回显会检查字符串-n的第一个参数,这将导致它抑制将在输出中最后一个参数之后出现的。

System V回声不支持任何选项,但允许在其操作数内进行转义序列,如OPERANDS部分中的XSI实现所述。

echo实用程序不支持实用程序语法准则10,因为历史应用程序依赖echo​​来回显其所有参数,但BSD版本中的-n选项除外。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

R:用R编写此公式的最有效方法是什么?

存储考勤数据的最有效或最有用的方法是什么?

在python中以二进制输出编写的最有效方法是什么?

时间序列:为子集编写代码的最有效方法是什么?

在python中编写[1:20,25:30]的最有效方法是什么

编写此程序的最有效方法是什么?(里面的细节)

用Java编写分支代码的最有效方法

用C替换数组中元素的最有效方法是什么

用分隔符连接字符串的最有效方法是什么

用JavaScript声明函数的最有效方法是什么?

用Java反向数组的最有效方法是什么?

用空值进行聚合的最有效方法是什么?

用熊猫循环遍历数据帧的最有效方法是什么?

用jquery筛选类别的最有效方法是什么?

用jquery创建迭代的Fade-In-Out函数的最有效方法是什么

用第一项对数组排序的最有效方法是什么?

在bash脚本中测试多个值的最有效方法是什么

Bash:处理 I/O 的最有效方法是什么?

计算此矩阵的最有效方法是什么?

Emacs:删除报价最有效的方法是什么?

使wifi工作最有效的方法是什么?

筛选搜索的最有效方法是什么?

修改Keras模型的最有效方法是什么?

组合此系列最有效的方法是什么?

重写大IN子句的最有效方法是什么?

Python:打印列表的最有效方法是什么?

筛选DataFrame的最有效方法是什么

执行此代码的最有效方法是什么?

处理 eventListener 的最有效方法是什么?