如何在AppleScript中转义shell参数?

时间:2011-11-15 14:47:53

标签: macos escaping applescript arguments

Applescript似乎没有正确地逃避字符串。我做错了什么?

示例:

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

预期/期望的输出:

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

实际输出:

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

正如您所看到的,似乎在实际输出中,Applescript正在添加和转义额外的'

我可以将结束字符设置为'",我也可以将单引号和双引号转义 - 但看起来实际上只有单引号逃脱了。

3 个答案:

答案 0 :(得分:8)

反斜杠通常不会在shell中的单引号内解释。

  

用单引号括起字符可保留单引号内每个字符的字面值。单引号内不能出现单引号。

     

反斜杠不能用于转义在单引号中设置的字符串中的单引号。可以通过写入来创建嵌入的引号,例如:'a'\''b',它产生'b。

然而,它们是由sh在sh中解释的,这是do shell script使用的shell:

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

取消设置xpg_echo使其行为类似于bash中的回声:

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

通常使用HEREDOC重定向更简单:

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

答案 1 :(得分:6)

使用“引用形式”。通常在applescript中我们处理一个“mac”样式路径,所以我们会做这样的事情将它传递给shell ...

set theFile to choose file
set dirname to do shell script "dirname " & quoted form of POSIX path of theFile

答案 2 :(得分:3)

不,'中没有添加额外的'funky-!@#'\''#"chars'

正如17510427541297已经指出的那样,AppleScript的quoted form of惯用语适用于Unix shell,而Unix shell中的字符串如果直接放在彼此旁边就会连接起来。

AppleScript的quoted form of abc只是这样做:它创建一个由单引号括起来的字符串,但用'替换每个单引号'\''

实际上,这创建了三个单独的字符串,但是三个单独的字符串在(大多数)Unix shell中受到以下字符串概念机制的约束:

"funky-!@#'#\"chars"变为'funky-!@#' + \' + '#"chars'

生成的字符串适合被Unix shell解释为单个文字字符串(不会导致参数扩展问题等)。

# in Terminal.app
# note the escaping in: osascript -e '...'\''...'
quotedsrt="$(osascript -e '
set abc to "funky-!@#'\''#\"chars"
return quoted form of abc
')"

echo "$quotedsrt"                 # 'funky-!@#'\''#"chars'
eval echo "$quotedsrt"            # funky-!@#'#"chars
echo echo "$quotedsrt" | sh


# escaping mechanism for Bash shell
set +H
esc="'\''"
str="funky-!@#'#\"chars"
str="'${str//\'/${esc}}'"
set -H

echo "$str"                  # 'funky-!@#'\''#"chars'
eval echo "$str"             # funky-!@#'#"chars
echo echo "$str" | sh