Search code examples
macosescapingapplescriptarguments

How can I escape shell arguments in AppleScript?


Applescript does not seem to properly escape strings. What am I doing wrong?

Example:

set abc to "funky-!@#'#\"chars"
display dialog abc
display dialog quoted form of abc

Expected / Desired Output:

funky-!@#'#"chars
'funky-!@#\'#"chars'

Actual Output:

funky-!@#'#"chars
'funky-!@#'\''#"chars'

As you can see, it appears that in the actual output Applescript is adding and escaping an extra '

I would be OK with the end characters being either ' or " and I would also be fine with both the single and double quotes being escaped - but it appears that only the single quotes are actually escaped.


Solution

  • Backslashes aren't usually interpreted inside single quotes in shells.

    Enclosing characters in single quotation marks preserves the literal value of each character within the single quotation marks. A single quotation mark cannot occur within single quotation marks.

    A backslash cannot be used to escape a single quotation mark in a string that is set in single quotation marks. An embedded quotation mark can be created by writing, for example: 'a'\''b', which yields a'b.

    However they are interpreted by echo in sh, which is the shell used by do shell script:

    do shell script "echo " & quoted form of "\\t" --> "\t"
    

    Unsetting xpg_echo makes it behave like the echo in bash:

    do shell script "shopt -u xpg_echo; echo " & quoted form of "\\t" --> "\\t"
    

    Often it's simpler to use HEREDOC redirection instead:

    do shell script "rev <<< " & quoted form of "a\\tb" --> "b\\ta"