【问题标题】:Trouble escaping quotes in a shell script在 shell 脚本中转义引号时遇到问题
【发布时间】:2013-08-30 14:19:05
【问题描述】:

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

想法?

【问题讨论】:

  • 你能用反斜杠 (\) 转义 $ 符号,看看是否有帮助?
  • @ArunR: 用反斜杠 \ '转义' $ 不起作用,因为单引号字符串中没有转义字符。

标签: bash shell escaping osascript


【解决方案1】:

问题是在单引号内,没有特殊的元字符,所以$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 在 comment 中观察到 osascript 需要双引号并且不接受单引号,因此由于被调用程序的规则,它不起作用 - @ 987654333@.)

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

【讨论】:

  • 第一个完美运行。这正是我所需要的。感谢您的帮助和对问题的详细解释。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • Applescript 不能将单引号识别为字符串分隔符,因此虽然这在 shell 级别有效,但您会收到 AppleScript 语法错误。
    猜你喜欢
    • 2019-10-07
    • 2013-07-07
    • 2015-03-24
    • 2011-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-06
    相关资源
    最近更新 更多