2016-07-24 76 views
0

我已看过此主题:single quote escaping in applescript/shell尽管它很有帮助,但它并不能完全解决我的问题。这AppleScript的片段说明了这个问题:如何在appleScript/shell中转义单引号?

set lastName to "O'Donnell" 
set lastScript to "/usr/libexec/PlistBuddy /Users/david/.name.plist -c 'Set Last '" & quoted form of (lastName & "'") 
display dialog lastScript 
do shell script lastScript 

在我的家乡文件夹中的属性列表文件“.name.plist”中包含的关键‘最后一个’存储的名称‘奥唐奈’。变量lastScript传递为:

/usr/libexec/PlistBuddy /Users/david/.name.plist -c 'Set Last ''O'\''Donnell'\''' 

脚本执行,但“最后一个”设置为“奥唐奈”没有切身撇号。这表现在外壳运行此命令:

/usr/libexec/PlistBuddy /Users/david/.name.plist -c 'Print Last' 

PlistBuddy可以在交互模式下运行:

/usr/libexec/PlistBuddy /Users/david/.name.plist 

命令:

'Set Last O\'Donnell' 

成功保存的名称。我究竟做错了什么?

+0

你已经回答了你的问题,包括一个双引号的唯一方法是逃避它。 –

+0

我测试了你的脚本,它似乎工作,我只是'显示对话框引用的部分,然后在终端回显它,它的工作原理 –

回答

0

你的逃跑是搞砸了。放入双引号的文本值保持PlistBuddy快乐,那么单引号整个-c参数保持bash的快乐:

to escapeDoubleQuotes(txt) 
    set AppleScript's text item delimiters to "\\" 
    set lst to txt's text items 
    set AppleScript's text item delimiters to "\\\\" 
    set txt to lst as text 
    set AppleScript's text item delimiters to "\"" 
    set lst to txt's text items 
    set AppleScript's text item delimiters to "\\\"" 
    return lst as text 
end escapeDoubleQuotes 

set lastName to "O'Donnell" 

"/usr/libexec/PlistBuddy /Users/david/.name.plist -c " & quoted form of ("Set Last " & escapeDoubleQuotes(lastName)) 

--> "/usr/libexec/PlistBuddy /Users/david/.name.plist -c 'Set Last \"O'\\''Donnell\"'"