大多数(所有)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 剥离了它们,我在第二行echo 使用了最佳实践,并用引号包围了"$var"。不,单引号消失了。 :-(
我没有太多使用 ANSI 字符串的经验,因此其他人可能会提供一种解决方案,以保持单引号和 dbl 引号不变。
否则,我认为这不起作用。
您的工作流程不是很清楚,但猜测某些东西正在发出这些值(我希望您不必键入它们),我认为您最好将它们放入文件中。如果一个单独的程序将它们打印到终端,那么只需重定向到一个文件中
json_emitting_program --args .... > $tmpFile
或者使用旨在消除 tmp 文件的 Unix 工具,管道 |,并编写您的工具以从 std-in 读取其数据,而不是作为命令行参数。
那你会说要么
json_emitting_program --args .... | fudge_files
或者,使用 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