命令行参数的JSON

时间:2014-10-10 12:44:40

标签: json command-line scripting

假设我想编写一个需要接受略微结构化数据的工具,使用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.*

这是一个好主意还是坏主意?

有哪些陷阱?

1 个答案:

答案 0 :(得分:1)

大多数(所有)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字符串是定义为$'My Static ANSI String'$"myANSIString with $var input"的字符串 请注意,即使在第一个示例中,shell在第一次机会时匹配单引号,并将它们从输入字符串中删除。希望它是剥离它们的echo,我在第2 echo行使用了最佳实践,并在引号中包围了"$var"。不,单引号已经消失。 : - (

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

否则,我认为这不起作用。


你的工作流程不是很清楚,但猜测某些东西正在发出这些值(我希望你不必输入它们),我认为你把它们放到文件中要好得多。如果单独的程序将它们打印到终端,则只需重定向到文件

  json_emitting_program --args .... > $tmpFile

或者使用Unix工具来消除tmp文件,管道|,并编写工具从std-in读取数据,而不是作为命令行参数。

然后你会说

  json_emitting_program --args .... | fudge_files

OR,使用tmp文件

fudge_files < "$tmpFile"

如果您的数据源位于MS Windows输出中(例如),您可以使用Unix here-documents在文件上创建临时文件,类似

 cat - > $tmpFile << EOS
 paste your input here
 and here
 etc
 EOS

请注意,EOS必须在它自己的一行上,没有尾随的空格。

如果正确完成,shell应该向您返回提示。

确认该文件在那里并且是最新的

 ls -l $tmpFile

和上面一样,运行你的程序

fudge_files < "$tmpFile"

如果您不知道,可以创建tmpFile,只需对您想要命名的任何路径/文件进行简单分配:

tmpFile=/path/to/myTempFile

IHTH