将引用的参数传递给REBOL 3脚本

时间:2011-07-17 02:50:00

标签: rebol rebol3

我发现将引用的参数(包含空格)传递给REBOL 3脚本几乎是不可能的。例如:

rebol -q script.r "foo bar" 40

如果您检查system/script/args,则它包含字符串"foo bar 40"。这没用!信息丢失了。我需要知道"foo bar"是第一个参数,40是第二个参数。如果我检查system/options/args,我会得到以下块:["foo" "bar" "40"]。再说一次,没用!信息丢失了。

我怀疑解决这个问题的方法是使用某种类型的参数分隔符,例如,

rebol -q script.r 'foo bar' -n 40

这可以由PARSE轻松处理,但我仍然不喜欢它。 system/options/args每个传递的参数包含一个字符串应该非常困难。

REBOL很高兴使用,这是我发现的第一件事,我真的很失望。 :(

2 个答案:

答案 0 :(得分:4)

在REBOL 3中,您观察到的行为is a known bug

(目前,R3内部将args从操作系统传递到脚本作为单个字符串,连接过程中的所有原始参数。目前这个过程不完全可逆,这是导致此错误的原因.R3可能应该通过而是将参数作为字符串列表,有效地保留原始argv,但剥离了解释器本身使用的参数。)


在REBOL 2中,system/options/args更安全地用于命令行参数,而system/script/args可用于更直接地在REBOL脚本之间传递值。我假设R3会保留类似的行为。

这是一个检查参数解析行为的快速脚本:

REBOL []
print system/version
print "options args:"
probe system/options/args
print "script args:"
probe system/script/args

REBOL 2,在OSX上:

2.7.7.2.5
options args:
["foo bar" "40"]
script args:
"foo bar 40"

REBOL 3,OSX:

2.100.111.2.5
options args:
["foo" "bar" "40"]
script args:
"foo bar 40"

答案 1 :(得分:2)

你可以逃避引号:

rebol -q script.r \"foo bar\" 40

不知道这是shell还是REBOL的缺点?