用于命令行参数的JSON

用于命令行参数的JSON,json,command-line,scripting,Json,Command Line,Scripting,假设我想编写一个工具,它需要接受稍微结构化的数据,那么使用json作为命令行参数,以及在使用json时使用环境,是否合理 比如说 fudge_files "['file1', 'file2']" # here list of files could be used fudge_files --dirs "['dir1', 'dir2']" pattern.* another*.foo 或者在一个更复杂的例子中 fudge_files --dst "{'txt': ['/foo', '/bar

假设我想编写一个工具,它需要接受稍微结构化的数据,那么使用json作为命令行参数,以及在使用json时使用环境,是否合理

比如说

fudge_files "['file1', 'file2']"  # here list of files could be used
fudge_files --dirs "['dir1', 'dir2']" pattern.* another*.foo
或者在一个更复杂的例子中

fudge_files --dst "{'txt': ['/foo', '/bar'], 'pdf': ['/foo']}" pattern.*
这是个好主意还是个坏主意

陷阱是什么?

大多数(所有)shell都会看到单引号和dbl引号,并按照其标准过程处理它们

要保留引号以便将其作为数据传递,您需要对其进行转义,即

\"[\'file1\', \'file2\']\"
一旦您的数据开始包含合法的“\”字符,它就会变得非常丑陋。你可以想出一些技巧,但这会很痛苦,你可以花很多时间来调试与这种引用相关的问题

而且,如果你坚持下去,并让它发挥作用,那么,2-3个月后,你可能会认为“我可以将其中的一些放入变量中,然后使用
eval
”或其他疯狂方式将变量扩展为字符串。现在你真的陷入了调试噩梦

此外,我还使用shell ANSI字符串进行了快速测试,看看这是否有帮助,但是

$ var=$'"['file1', 'file2']"'
$ echo $var
"[file1, file2]"
$ echo "$var"
"[file1, file2]"
$ var=$""['file1', 'file2']""
-ksh: file2]: not found [No such file or directory]
ANSI字符串是定义为“
$”我的静态ANSI字符串“
或“
$”myANSIString with$var input”
请注意,即使在第一个示例中,shell也会在第一次机会匹配单引号,并将它们从输入字符串中剥离出来。希望是
echo
剥离了它们,我在第二行
echo
中使用了最佳实践,在引号中括起了
“$var”
。不,单引号不见了-(

我没有那么多使用ANSI字符串的经验,所以其他人可能会提供一个解决方案,使单引号和dbl引号保持不变

否则的话,我看这是行不通的


你的工作流程不是很清楚,但是猜测有什么东西在发出这些值(我希望你不必键入它们),我认为你最好将它们放入一个文件中。如果一个单独的程序正在将它们打印到终端,那么只需重定向到一个文件中即可

  json_emitting_program --args .... > $tmpFile
或者使用设计用于删除tmp文件的Unix工具,即管道
|
,并将您的工具编写为从std in读取其数据,而不是作为命令行参数

那么你会说

  json_emitting_program --args .... | fudge_files
或者,使用tmp文件

fudge_files < "$tmpFile"
请注意,EOS必须位于自己的一行上,没有尾随空格

如果操作正确,shell将向您返回提示

确认文件存在并且是最新的

 ls -l $tmpFile
如上所述,运行您的程序

fudge_files < "$tmpFile"

IHTH

关于在shell脚本中重用复杂参数的好观点。我对您的示例
$'“[…]”“
有一个额外的引号层感到有点困惑;也对您的断言所有引号都必须转义感到困惑。是否使用不同的引号来转义和内容还不够?是的,
$”[…]”“
示例是shell的高级功能(ANSI字符串有两种形式,
$”…str.
$”.strW$vars.
)。不幸的是,我对它们没有太多的经验,只是我知道我所包含的示例是有效的。我的观点是,当使用
$”…
表单时,示例字符串中的内部单引号将丢失,并使用“$”…”'从ANSI字符串中,当shell尝试计算该行时,您的示例字符串将导致错误。有关bash shell版本的
printf
及其功能
%q
这可能会对您有所帮助……但是……同样,尝试在命令行上读取这样的字符串是错误的方法。请花时间获取
fudge_文件
,以便它可以在(管道或重定向)中读取std,这样您将有一个更灵活、更稳定的解决方案。;-)祝你好运。@qarma:你有机会通过
curl
发送数据吗?我在S.O上看到了很多关于
json
curl
的类似查询以及这里的命令行。基本上
curl-X POST-data@/path/to/dataFile${URL}
可能会有所帮助。祝你好运。在一个奇怪的命运转折中,curl或(视情况而定)requests(请求)最终被卷入其中。但是,这种结构化数据不是逐字发送的。我的工具将实际使用这些数据来映射文件系统中的对象,将其转换为自定义格式,等等。我的想法是为一组工具提供统一的API。
fudge_files < "$tmpFile"
tmpFile=/path/to/myTempFile