在Bash中组合变量以形成使用osascript命令发送到AppleScript的命令

时间:2013-06-06 15:27:04

标签: macos bash applescript osascript

我正在努力使这个脚本工作。它是一个Bash脚本,用于获取一些变量,将它们放在一起并使用结果发送AppleScript命令。手动粘贴从to_osa后面的变量osascript -e回显到终端的字符串可以按照我的要求运行并期望它。但是当我尝试将命令osascript -e和字符串to_osa组合在一起时,它不起作用。我怎样才能做到这一点?

the_url="\"http://stackoverflow.com/questions/1521462/looping-through-the-content-of-a-file-in-bash\""
the_script='tell application "Safari" to set the URL of the front document to '
delimiter="'"
to_osa=${delimiter}${the_script}${the_url}${delimiter}
echo ${to_osa}
osascript -e ${to_osa}

除了手动工作之外,当我将所需命令写入脚本然后执行它时,脚本也可以工作:

echo "osascript -e" $to_osa > ~/Desktop/outputfile.sh
sh  ~/Desktop/outputfile.sh

2 个答案:

答案 0 :(得分:12)

字符串混搭可执行代码容易出错且很邪恶,这里绝对没有必要。通过定义一个明确的“运行”处理程序将参数传递给AppleScript是微不足道的:

on run argv -- argv is a list of strings
    -- do stuff here
end run

然后你这样调用:

osascript -e /path/to/script arg1 arg2 ...

顺便说一句,如果你的脚本需要固定数量的args,你也可以这样写:

on run {arg1, arg2, ...} -- each arg is a string
    -- do stuff here
end run

...

更进一步,您甚至可以像使用任何其他shell脚本一样直接执行AppleScript。首先,按如下方式添加一个hashbang:

#!/usr/bin/osascript

on run argv
    -- do stuff here
end run

然后以未编译的纯文本格式保存并运行chmod +x /path/to/myscript以使文件可执行。然后,您可以按如下方式从shell执行它:

/path/to/myscript arg1 arg2 ...

或者,如果您不想每次都指定完整路径,请将文件放在/usr/local/bin或shell的PATH上的其他目录中:

myscript arg1 arg2 ...

...

所以这就是你应该如何编写原始脚本:

#!/bin/sh
the_url="http://stackoverflow.com/questions/1521462/looping-through-the-content-of-a-file-in-bash"
osascript -e 'on run {theURL}' -e 'tell application "Safari" to set URL of document 1 to theURL' -e 'end run' $the_url

快速,简单,非常强大。

-

P.S。如果您想在新窗口而不是现有窗口中打开URL,请参阅OS X的open工具的联机帮助页。

答案 1 :(得分:2)

作为一般规则,不要在变量中放置双引号,将它们放在变量。在这种情况下,它更复杂,因为你有一些双引号用于bash级引用,还有一些用于AppleScript级引用;在这种情况下,AppleScript级引号放在变量中,bash级引号围绕变量:

the_url="\"http://stackoverflow.com/questions/1521462/looping-through-the-content-of-a-file-in-bash\""
the_script='tell application "Safari" to set the URL of the front document to '
osascript -e "${the_script}${the_url}"

BTW,使用echo来检查这样的事情是非常误导的。 echo告诉你变量中的内容,而不是在命令行上引用变量时将执行的内容。最大的区别是echo在经过bash解析(引用和转义删除等)之后打印其参数,但当你说“手动粘贴字符串......工作时” “在解析之前,你说的是你想要的。如果引号在回显的字符串中,则表示bash不会将它们识别为引号并将其删除。比较:

string='"quoted string"'
echo $string          # prints the string with double-quotes around it because bash doesnt't recognize them in a variable
echo "quoted string"  # prints *without* quotes because bash recognizes and removes them