麻烦转义shell脚本中的引号

时间:2013-08-30 14:19:05

标签: bash shell escaping osascript

我正在创建一个bash脚本生成一些数字,将它们分配给变量,然后使用osascript将它们写入任何选择的应用程序中。

以下是我想要做的简化版本。

monday1=5
osascript -e 'tell application "System Events" to keystroke "$monday1"'; \

osascript应该看起来像这样

osascript -e 'tell application "System Events" to keystroke "5"'; \

这将在我的光标应用程序中键入数字5.问题是输出$ monday1而不是。我知道我必须做一些事情来逃避引号,所以脚本可以输入变量,但我不确定如何。

思想?

3 个答案:

答案 0 :(得分:5)

问题是在单引号内,没有特殊的元字符,因此$monday1传递给osascript不变。因此,您必须确保$monday1不在单引号内。

您的选择包括:

monday1=5
osascript -e 'tell application "System Events" to keystroke "'$monday1'"'

monday1=5
osascript -e 'tell application "System Events" to keystroke "'"$monday1"'"'

monday1=5
osascript -e "tell application \"System Events\" to keystroke \"$monday1\""

monday1=5
osascript -e "tell application 'System Events' to keystroke '$monday1'"

第一个停止双引号后的单引号以包围键击,嵌入$monday的值,并恢复剩余双引号的单引号。这是有效的,因为$monday1中没有空格等。

第二个与第一个类似,但用双引号括起"$monday1",因此即使$monday1包含空格也能正常工作。

第三个用双引号括起整个参数,并转义每个嵌入的双引号。如果你对反斜杠没有过敏,这很好。

第四个可能有效也可能无效 - 这取决于osascript程序是否对其参数周围的引号类型敏感。它只是颠倒了双引号和单引号的使用。 (就shell而言,这是有用的。Gordon Davissoncomment中观察到osascript需要双引号并且不接受单引号,因此它不起作用,因为规则调用的程序 - osascript。)

在第三种情况和第四种情况下,如果字符串的其他部分需要保护,则需要小心,以便shell不会扩展信息。一般来说,单引号更好,所以我会使用前两个选项中的一个。

答案 1 :(得分:1)

来自没有变量替换的范围的单引号。

osascript -e "tell application \"System Events\" to keystroke \"$monday1\""; \

答案 2 :(得分:0)

将整个字符串用单引号括起来可以防止变量monday1被插值。切换双引号和单引号:

osascript -e "tell application 'System Events' to keystroke '$monday1'";