single quote escaping in applescript/shell

无人久伴 提交于 2019-12-21 02:52:19

问题


I'm trying to process this shell script in applescript, but it keeps saying error EOF, because of the single quote in the folder name.

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

The folder /My 'Folder/ is a legitimate directory.

The variable a = '/Applications/MyProgram/' (and includes the single quotes)

The variable d = /Folders (with no single quotes)

However, shell is getting stuck processing it, im guessing because the folder is enclosed in quotes.

Is there any way to escape this single quote, so it works in applescript using shell? Ive tried multiple backslashes but its not working.

Cheers

N


回答1:


Always use quoted form of when using arbitrary data as an argument to an command. This will always quote the value even if it doesn't need to be quoted but it's better safe than sorry. When you have a string single quoted, you can only unquote (turn substitution mode back on) with another quote. Unlike AppleScript strings, you can't escape characters inside single quoted strings. So you need to turn substitution mode on, escape a quote and then turn substitution mode back one. For instance "Joe's car" should be quoted as "'Joe'\\''s car'". It's a quoted string "Joe" + escaped quote character + quoted string "s car". But like I started you should use quoted form of, quoted form of "Joe's car" will return "'Joe'\\''s car'"

Your command using quoted form will look like:

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



回答2:


The problem arises because you have that tick in the filename of course, on the terminal commandline you would use a tick - double-tick tick - double-tick tick sequence to present it.

(From the terminal below)

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

In Applescript, and your command line, it becomes even more complicated, I recommend you echo your commandline, until you get back what you expect.

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

I think you'll have to start out with that, and reconstruct how you escape the rest of the commandline around it, if it can't be just plugged in as it is.

You should also remove single quotes for entities, that doesn't need them, (no spaces). That way your commandline will become easier to both edit and read.




回答3:


Adding an answer for JavaScript for AppleScript (JAX) users based on answer from McUsr:

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);
}

If you don't know what JAX is it's AppleScript but using JavaScript. Open Script Editor and select JavaScript from the dropdown beneath the record button.



来源:https://stackoverflow.com/questions/28358317/single-quote-escaping-in-applescript-shell

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!