3

我正在制作一个 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 代替。我知道我必须做一些事情来转义引号,以便脚本可以输入变量,但我不确定如何。

想法?

4

3 回答 3

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程序是否对其参数周围的引号类型敏感。它只是颠倒了双引号和单引号的使用。(就外壳而言,这有效。Gordon Davisson在需要双引号且不接受单引号的注释中观察到osascript,因此由于被调用程序的规则,它不起作用 - osascript。)

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

于 2013-08-30T14:36:21.803 回答
1

单引号形成一个没有变量替换的范围。

osascript -e "tell application \"System Events\" to keystroke \"$monday1\""; \
于 2013-08-30T14:24:55.730 回答
0

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

osascript -e "tell application 'System Events' to keystroke '$monday1'";
于 2013-08-30T14:23:53.687 回答