8

我正在尝试使这个脚本工作。这是一个Bash脚本,旨在获取一些变量,将它们放在一起并使用结果发送AppleScript命令。to_osa手动将从后面的变量回显的字符串粘贴osascript -e到终端可以按我的意愿和期望工作。但是当我尝试将 commandosascript -e和 string结合起来时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
4

2 回答 2

13

字符串混搭可执行代码容易出错且很邪恶,这里绝对不需要它。通过定义显式的“运行”处理程序将参数传递给 AppleScript 很简单:

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

然后你像这样调用它:

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

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

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

...

更进一步,您甚至可以使 AppleScript 像其他任何 shell 脚本一样直接可执行。首先,添加一个 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

快速、简单且非常强大。

--

ps 如果您宁愿在新窗口中打开 URL 而不是在现有窗口中打开 URL,请参阅 OS Xopen工具的联机帮助页。

于 2013-06-07T06:11:18.377 回答
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}"

顺便说一句,echo用来检查这样的事情是高度误导的。echo告诉您变量中的内容,而不是在命令行上引用变量时将执行的内容。最大的区别是它在通过 bash 解析(引用和转义删除等)之后echo打印它的参数,但是当你说“手动粘贴字符串......工作”时,你说这是你解析之前想要的。如果回显字符串中有引号,则意味着 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
于 2013-06-06T16:11:11.343 回答