2016-07-24 28 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\"'"