问题 将变量从shell脚本传递给applescript


我有一个我称之为使用的shell脚本 osascript, 然后 osascript 调用shell脚本并传入我在原始shell脚本中设置的变量。我不知道如何将该变量从applescript传递到shell脚本。

如何将变量从shell脚本传递到applescript到shell脚本......?

如果我没有意义,请告诉我。

 i=0
 for line in $(system_profiler SPUSBDataType | sed -n -e '/iPad/,/Serial/p' -e '/iPhone/,/Serial/p' | grep "Serial Number:" | awk -F ": " '{print $2}'); do
 UDID=${line}
 echo $UDID
 #i=$(($i+1))
 sleep 1


 osascript -e 'tell application "Terminal" to activate' \
 -e 'tell application "System Events" to tell process "Terminal" to keystroke "t" using command down' \
 -e 'tell application "Terminal" to do script "cd '$current_dir'" in selected tab of the front window' \
 -e 'tell application "Terminal" to do script "./script.sh ip_address '${#UDID}' &" in selected tab of the front window'

 done

10223
2018-06-21 19:19


起源



答案:


Shell变量不会在单引号内扩展。当你想要传递shell变量时 osascript 你需要使用双倍 "" 引号。问题是,你必须转义osascript中所需的双引号,如:

剧本

say "Hello" using "Alex"

你需要逃脱报价

text="Hello"
osascript -e "say \"$text\" using \"Alex\""

这不是很易读,因此使用bash更好 heredoc 功能,像

text="Hello world"
osascript <<EOF
say "$text" using "Alex"
EOF

你可以在里面写一个免费的多行脚本,它比使用多个更好 -e ARGS ...


13
2018-06-21 19:57



这是一个糟糕的建议。除了不必要地笨拙之外,它不会对插入的文本进行消毒,因此既不健壮也不安全,例如 text='Bob says "hello"' 由于未转义的引号,将导致AS抛出语法错误。如果存在更好的解决方案,就不要使用代码重写,它确实如此:正如Lauri Ranta所说,定义一个明确的解决方案 run 处理程序并通过ARGV传递您的字符串。看到 stackoverflow.com/questions/16966117/... 了解更多细节。 - foo
@foo你是对的,使用 on run argv “更”正确。我的不是 完善 解决方案,但我自己多次使用它没有任何问题,它很简单,可用于许多脚本...... - jm666
你的是一个 越野车 解。如果$ text包含双引号或反斜杠字符,则会导致AS代码出错或 - 更糟糕 - 以非预期的方式运行。如果你必须使用代码munging,你 必须 消毒你的投入。例如谷歌“SQL注入攻击”理解为什么“它对我有用”是 不 当有人指出这个缺陷时,一个适当的回应。 - foo
@foo是的,是的 - 你是对的...;) - jm666


答案:


Shell变量不会在单引号内扩展。当你想要传递shell变量时 osascript 你需要使用双倍 "" 引号。问题是,你必须转义osascript中所需的双引号,如:

剧本

say "Hello" using "Alex"

你需要逃脱报价

text="Hello"
osascript -e "say \"$text\" using \"Alex\""

这不是很易读,因此使用bash更好 heredoc 功能,像

text="Hello world"
osascript <<EOF
say "$text" using "Alex"
EOF

你可以在里面写一个免费的多行脚本,它比使用多个更好 -e ARGS ...


13
2018-06-21 19:57



这是一个糟糕的建议。除了不必要地笨拙之外,它不会对插入的文本进行消毒,因此既不健壮也不安全,例如 text='Bob says "hello"' 由于未转义的引号,将导致AS抛出语法错误。如果存在更好的解决方案,就不要使用代码重写,它确实如此:正如Lauri Ranta所说,定义一个明确的解决方案 run 处理程序并通过ARGV传递您的字符串。看到 stackoverflow.com/questions/16966117/... 了解更多细节。 - foo
@foo你是对的,使用 on run argv “更”正确。我的不是 完善 解决方案,但我自己多次使用它没有任何问题,它很简单,可用于许多脚本...... - jm666
你的是一个 越野车 解。如果$ text包含双引号或反斜杠字符,则会导致AS代码出错或 - 更糟糕 - 以非预期的方式运行。如果你必须使用代码munging,你 必须 消毒你的投入。例如谷歌“SQL注入攻击”理解为什么“它对我有用”是 不 当有人指出这个缺陷时,一个适当的回应。 - foo
@foo是的,是的 - 你是对的...;) - jm666


您还可以使用运行处理程序或导出:

osascript -e 'on run argv
    item 1 of argv
end run' aa

osascript -e 'on run argv
    item 1 of argv
end run' -- -aa

osascript - -aa <<'END' 2> /dev/null
on run {a}
    a
end run
END

export v=1
osascript -e 'system attribute "v"'

我不知道有什么方法可以获得STDIN。 on run {input, arguments} 仅适用于Automator。


2
2018-06-21 21:27