applescript/shell 中的单引号转义

single quote escaping in applescript/shell

我正在尝试在 applescript 中处理此 shell 脚本,但由于文件夹名称中的单引号,它一直显示错误 EOF。

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

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

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

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

但是,shell 正在处理它,我猜是因为文件夹用引号括起来了。

有什么方法可以转义这个单引号,所以它可以在 applescript 中使用 shell 吗?我尝试了多个反斜杠,但它不起作用。

干杯

N

问题的出现是因为你在文件名中有那个勾号,当然,在终端命令行上你会使用一个勾号 - 双勾号 - 双勾号序列来呈现它。

(来自下面的终端)

729$ echo 'My '"'"'Java Folder'
My 'Java Folder

在 Applescript 和你的命令行中,它变得更加复杂,我建议你回显你的命令行,直到你得到你期望的结果。

set res to (do shell script "echo 'My '\"'\"'Java Folder'")
log res
--> (*My 'Java Folder*)

我认为你必须从它开始,并重建你如何逃避它周围的其余命令行,如果它不能按原样插入。

您还应该删除不需要实体的单引号(无空格)。这样你的命令行将变得更容易编辑和阅读。

在使用任意数据作为命令的参数时始终使用 quoted form of。这将始终引用该值,即使它不需要被引用,但它比抱歉更安全。当你有一个单引号的字符串时,你只能用另一个引号取消引号(重新打开替换模式)。与 AppleScript 字符串不同,您无法对单引号字符串中的字符进行转义 。因此,您需要打开替换模式,转义引号,然后将替换模式转回原来的模式。例如 "Joe's car" 应该被引用为“'Joe'\\''s car'”。它是一个带引号的字符串 "Joe" + 转义引号字符 + 带引号的字符串 "s car"。但是就像我开始的那样,你应该使用 quoted form ofquoted form of "Joe's car" 将 return "'Joe'\''s car'"

您使用引号形式的命令如下所示:

do shell script "cp -R " & quoted form of a & space & quoted form of (d & "/My 'Folder/java/")

根据 McUsr 的回答为 AppleScript (JAX) 用户添加 JavaScript 的回答:

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 是什么,它是 AppleScript,但使用的是 JavaScript。打开脚本编辑器,然后从记录按钮下方的下拉菜单中选择 select JavaScript。