.goat 脚本中的参数和变量
在 .goat 脚本中传递参数、局部变量、环境变量以及插值规则。
.goat 脚本中的参数和变量
.goat 脚本可以使用运行时传递的参数、本地变量以及环境变量。
提供四种基本机制:
{{args}}— 传递给脚本的所有参数,{{args.nazwa}}— 指定的命名参数,{{zmienna}}— 由set定义的本地变量,{{env.NAZWA}}— 环境变量。
参数和本地变量属于当前脚本。子脚本只有在显式传递给它们时才能获得这些值。
向脚本传递参数
脚本参数在分隔符 -- 后传递。
goat run:script --path=herd/translate.goat -- --force在此示例中:
--path=herd/translate.goat是 run:script 选项,而:
--force是 translate.goat 脚本的参数。
可以传递任意数量的参数:
goat run:script --path=herd/example.goat -- --force --model=gpt-5 --verbose如果没有分隔符 --,参数会被解释为 run:script 命令的选项。
所有参数 — {{args}}
{{args}} 会展开为传递给当前脚本的所有参数。
示例:
translate:sync --catalog="catalog.json" {{args}}运行:
goat run:script --path=herd/translate.goat -- --force --model=gpt-5在这种情况下等同于向 translate:sync 传递:
--force --model=gpt-5参数顺序会被保留。
如果未向脚本传递任何参数,{{args}} 会展开为空列表。这不会导致错误。
因此,可以安全地编写:
translate:sync --catalog="catalog.json" {{args}}并将同一脚本既用于不带额外选项的情况:
goat run:script --path=herd/translate.goat也用于带额外选项的情况:
goat run:script --path=herd/translate.goat -- --force{{args}} 作为独立令牌
{{args}} 只能作为独立令牌出现。
正确:
command {{args}}错误:
command --options={{args}}这是必要的,因为 {{args}} 可以展开为零个、一个或多个参数。
命名参数 — {{args.nazwa}}
可以通过以下方式引用特定参数:
{{args.nazwa}}例如:
command {{args.model}}支持以下形式的长参数:
--model
--model=gpt-5
--model gpt-5保留原始形式
参数会以传入时的相同形式传递。
对于:
--model=gpt-5表达式:
{{args.model}}会传递:
--model=gpt-5而对于:
--model gpt-5则会传递两个令牌:
--model
gpt-5多次出现
如果同一参数出现多次,其所有出现位置都会按原始顺序保留。
示例:
--tag=a --tag b --tag=c引用:
{{args.tag}}将传递全部三次出现的参数。
缺少参数
引用未传递的参数会以错误终止脚本执行。
示例:
command {{args.model}}要求存在参数 --model。
如果参数是可选的,通常更方便通过以下方式传递所有可选参数:
{{args}}独立令牌
与 {{args}} 一样,{{args.nazwa}} 也只能作为独立令牌出现。
正确:
command {{args.model}}错误:
command --model={{args.model}}本地变量 — set
可以通过以下方式定义本地变量:
set model = "gpt-5"随后可以在后续命令中使用它:
command --model={{model}}或作为单独的参数:
command {{model}}变量从其声明位置起可用,并且仅属于当前脚本。
示例:
set catalog = "catalog.json"
set model = "gpt-5"
translate:sync --catalog={{catalog}} --model={{model}}变量值不会再次拆分
局部变量的值始终被视为单个值。
示例:
set options = "--foo --bar"
command {{options}}会传递一个参数:
--foo --bar而不是两个独立的参数:
--foo
--bar如果需要传递多个参数,请使用 {{args}},或直接将它们写入命令中。
环境变量 — {{env.NAZWA}}
可以通过以下方式引用环境变量:
{{env.NAZWA}}示例:
translate:sync --model={{env.GOAT_OPENAI_MODEL}}也可以在 token 内部使用它们:
command --endpoint={{env.API_ENDPOINT}}环境变量的值会被视为单个值,不会再次拆分为参数。
如果指定的环境变量不存在,脚本执行将以错误结束。
在引用值中使用变量
局部变量和环境变量也可以在引用值内部使用。
set model = "gpt-5"
translate:sync --model="{{model}}"以及:
translate:sync --model="{{env.GOAT_OPENAI_MODEL}}"还可以将它们与固定文本组合:
set locale = "pl"
command --catalog="catalog-{{locale}}.json"参数和变量的作用域
每个 .goat 脚本都有自己的:
- 参数,
- 由
set定义的局部变量。
它们不会自动在所启动的子脚本中可用。
示例:
run:script --path=herd/child.goatchild.goat 启动时不带父脚本的参数和局部变量。
环境变量仍可通过以下方式访问:
{{env.NAZWA}}向子脚本传递参数
如果子脚本需要接收父脚本的参数,必须显式传递它们。
run:script --path=herd/child.goat -- {{args}}这样,child.goat 将接收当前脚本的所有参数。
也可以只传递选定的参数:
run:script --path=herd/child.goat -- {{args.model}}或者基于局部变量构建参数:
set model = "gpt-5"
run:script --path=herd/child.goat -- --model={{model}}因此,每个脚本只会接收明确传递给它的数据。
可用的插值形式
| 语法 | 含义 | 可返回多个参数 | 可作为 token 的一部分 |
{{args}} | 脚本的所有参数 | 可以 | 不可以 |
{{args.nazwa}} | 指定的命名参数 | 可以 | 不可以 |
{{zmienna}} | 本地变量 | 不可以 | 可以 |
{{env.NAZWA}} | 环境变量 | 不可以 | 可以 |
正确用法示例:
command {{args}}
command {{args.model}}
command {{model}}
command --model={{model}}
command --model={{env.GOAT_OPENAI_MODEL}}不正确:
command prefix-{{args}}
command --model={{args.model}}示例:向 translate:sync 传递选项
脚本可以将所有接收到的参数直接传递给 translate:sync:
translate:sync --catalog="catalog.json" {{args}}标准运行方式:
goat run:script --path=herd/translate.goat不会传递任何额外选项。
运行:
goat run:script --path=herd/translate.goat -- --force会将 --force 传递给 translate:sync。
类似地:
goat run:script --path=herd/translate.goat -- --force --model=gpt-5会按相同顺序传递两个选项。
完整脚本示例
set catalog = "catalog.json"
set defaultModel = "gpt-5"
translate:prepare --catalog={{catalog}}
translate:sync --catalog={{catalog}} --fallback-model={{defaultModel}} {{args}}脚本可以不带额外参数运行:
goat run:script --path=herd/example.goat或传递额外选项:
goat run:script --path=herd/example.goat -- --force --model=gpt-5错误
脚本执行会在以下情况中断:
- 使用了未定义的本地变量,
- 指定的环境变量不存在,
{{args.nazwa}}引用了未传递的参数,{{args}}或{{args.nazwa}}在另一个 token 内部使用。
错误消息会指出脚本中出现问题的位置,从而可以识别错误的引用。