gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 09:06:37 26 4
gpt4 key购买 nike

所以我必须用 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

...只打开一次输出文件,消除了主要的低效问题。

明确一点:调用 echo,比方说,调用 20 次比调用 cat 一次要有效得多,因为 cat 是一个外部进程,而不是 shell 的一部分。 运行 echo "foo">>file 20 次非常低效的是打开和关闭输出文件 20 次;它不是 echo 本身。


正确生成JSON

不要使用 catechoprintf 或任何其他类似的东西。相反,使用理解 JSON 的工具——任何其他方法都可能导致不正确的结果(甚至可能通过注入(inject)攻击被利用)。

例如:

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

...将生成一个基于 template.json 的 JSON 文件,其中 something 设置为 shell 变量 "$some_value_here"another_value 设置为第二个值。与朴素的方法不同,这将正确处理包含文字引号或其他需要转义才能正确表示的字符的变量值。


echo 旁白

上述所有内容——应避免使用 echo 以支持 printf(使用适当的静态格式字符串)。 Per the POSIX sh standard :

APPLICATION USAGE

It is not possible to use echo portably across all POSIX systems unless both -n (as the first argument) and escape sequences are omitted.

The printf utility can be used portably to emulate any of the traditional behaviors of the echo utility as follows (assuming that IFS has its standard value or is unset):

[...]

New applications are encouraged to use printf instead of echo.

RATIONALE

The echo utility has not been made obsolescent because of its extremely widespread use in historical applications. Conforming applications that wish to do prompting without s or that could possibly be expecting to echo a -n, should use the printf utility derived from the Ninth Edition system.

As specified, echo writes its arguments in the simplest of ways. The two different historical versions of echo vary in fatally incompatible ways.

The BSD echo checks the first argument for the string -n which causes it to suppress the that would otherwise follow the final argument in the output.

The System V echo does not support any options, but allows escape sequences within its operands, as described for XSI implementations in the OPERANDS section.

The echo utility does not support Utility Syntax Guideline 10 because historical applications depend on echo to echo all of its arguments, except for the -n option in the BSD version.

关于json - 使用 Bash 编写 JSON 文件的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31254887/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com