AppleScript/Shell中单引号转义

6

我试图在AppleScript中处理这个shell脚本,但由于文件夹名称中有单引号,所以一直报错EOF错误。

do shell script "cp -R " & a & " " & "'" & d & "/My 'Folder/java/" & "'"

文件夹/My 'Folder/是一个合法的目录。

变量a = '/Applications/MyProgram/'(包括单引号)

变量d = /Folders(没有单引号)

然而,shell在处理它时卡住了,我猜测是因为文件夹被引号包含。

有没有办法转义这个单引号,以便在使用shell的applescript中正常工作? 我尝试了多个反斜杠,但它没有起作用。

谢谢

N

3个回答

7
始终使用quoted form of,当将任意数据用作命令参数时。即使不需要引号,这样做也会始终引用该值,但安全起见最好如此。当您有一个字符串单引号时,只能使用另一个引号取消引用(将替换模式重新打开)。与AppleScript字符串不同,您无法在单引号字符串中转义字符。因此,您需要打开替换模式,转义引号,然后再打开替换模式。例如,“Joe's car”应被引用为“'Joe'\\''s car'”。这是一个引用字符串“Joe”+转义引号字符+引用字符串“s car”。但是,就像我开始的一样,您应该使用quoted form ofquoted form of "Joe's car"将返回"'Joe'\\''s car'" 使用引用形式的命令如下:
do shell script "cp -R " & quoted form of a & space & quoted form of (d & "/My 'Folder/java/")

这个。这个。一万亿次的这个。永远不要使用未经过净化的字符串来组装shell脚本或任何其他代码。 - foo
3
虽然用户不知道如何使用quoted form of <string>,但他们有自己的理由。这也与Standard Additions字典的糟糕有关。这样关键的信息应该在do shell script命令的文档中显示,以避免被忽略。您可以在此问题上提交一个Radar工单。 - foo
实际上,有一些边缘情况,当引用形式无法工作时,例如如果您想在sed脚本的某个模式中使用换行符,但我同意在大多数情况下,引用形式是最实用的,并且这个特定的功能文档不足,我认为标准附加文档已经很久没有更新了。 :D - McUsr
如果一个命令有它自己的字符串类型,你应该先转义/引用字符串到命令的格式,然后使用 quoted form of。这不是一个边缘情况,如果你尝试另一种方式,那只是一个糟糕的工作流程。当你多次编码数据时,你需要按相反的顺序解码它,就像你编码它一样。对于引用/转义参数也是如此。首先引用/转义成将被取消引用/转义的格式。 - dj bazzie wazzie
记录一下:像sed表达式一样引用静态类型参数并没有什么问题。 - dj bazzie wazzie

1
问题的出现是因为文件名中有一个勾号,当然,在终端命令行中,您需要使用勾号-双勾号勾号-双勾号勾号序列来表示它。
(来自下面的终端)
729$ echo 'My '"'"'Java Folder'
My 'Java Folder

在Applescript和命令行中,它变得更加复杂,我建议您将命令行回显,直到您获得预期的结果。
set res to (do shell script "echo 'My '\"'\"'Java Folder'")
log res
--> (*My 'Java Folder*)

我认为你需要从这里开始,并重新构建如何转义其余的命令行,如果不能直接插入。

您还应该删除实体的单引号,这是不必要的(没有空格)。这样,您的命令行将更易于编辑和阅读。


1
这是错误的建议。请查看dj bazzie wazzie的答案以获取正确的解决方案。 - foo
1
也许这并不是一个好建议,不过它同样有效,因为参数中没有其他部分需要引用。不过我同意 DJ Bazzie Wazzie 的解决方案更好。 - McUsr
我正在使用JavaScript for AppleScript (JAX),并且使用这个答案对我有用。在此之前,我对字符串进行了替换,使用了var source = "/documents/John's Spreadsheet.xls"; source = source.replace("'", "'\"'\"'", "g"); - 1.21 gigawatts

0

基于McUsr的答案,为JavaScript for AppleScript (JAX)用户添加一个答案:

debugger

var app = Application.currentApplication();
app.includeStandardAdditions = true;

var source = "/documents/John's Spreadsheet.xls";
var target = "/documents/John's Spreadsheet.csv";

source = source.replace("'", "'\"'\"'", "g");
target = target.replace("'", "'\"'\"'", "g");

var exportScript = "/excel -i";
exportScript += " '" + source + "'";
exportScript += " '" + target + "'";
exportScript += ";true";

try {
    app.doShellScript(exportScript);
}
catch (error) {
    console.log(error.message);
}

如果你不知道JAX是什么,它就是使用JavaScript的AppleScript。打开脚本编辑器,在记录按钮下拉菜单中选择JavaScript。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接