麻烦转义shell脚本中的引号

3 bash shell escaping osascript

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

这是我想要做的简化版本.

monday1=5
osascript -e 'tell application "System Events" to keystroke "$monday1"'; \
Run Code Online (Sandbox Code Playgroud)

osascript应该是这样的

osascript -e 'tell application "System Events" to keystroke "5"'; \
Run Code Online (Sandbox Code Playgroud)

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

思考?

Jon*_*ler 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'"
Run Code Online (Sandbox Code Playgroud)

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

第二个类似于第一个,但"$monday1"用双引号括起来,所以即使$monday1包含空格也能工作.

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

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

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