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 of
,quoted 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。
我正在尝试在 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 of
,quoted 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。