因此,我必须使用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
是外部过程,而不是外壳程序的一部分。运行echo "foo" >>file
20次非常低效的是打开和关闭输出文件20次。不是echo
它本身。
不要使用cat
,echo
,printf
,或其他任何东西的那种。相反,请使用能够理解JSON的工具-任何其他方法都会导致潜在的错误结果(甚至可能通过注入攻击加以利用)。
例如:
jq \
--arg something "$some_value_here" \
--arg another "$another_value" \
'.["something"]=$something | .["another_value"]=$another' \
<template.json >output.json
...将基于生成一个JSON文件,template.json
其something
设置为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] 删除。
我来说两句