Applescript似乎没有正确地逃避字符串。我做错了什么?
示例:
set abc to "funky-!@#'#\"chars"
display dialog abc
display dialog quoted form of abc
预期/期望的输出:
funky-!@#'#"chars
'funky-!@#\'#"chars'
实际输出:
funky-!@#'#"chars
'funky-!@#'\''#"chars'
正如您所看到的,似乎在实际输出中,Applescript正在添加和转义额外的'
我可以将结束字符设置为'
或"
,我也可以将单引号和双引号转义 - 但看起来实际上只有单引号逃脱了。
答案 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