Nelson
译者
⚠️ 注意
如果您发现了错误,欢迎 参与贡献。
💡 技巧小贴士
本页内容较多,您可以使用 Ctrl/Command
+ F
快速查找本页面的关键词。
如果想快速搜索全站内容,也可以在页面中单击 /
键 快速全文检索关键词。
对于小屏用户,您可以点击右上角的 放大镜
(🔍) 图标以输入关键词进行全文检索。
请注意查看下方的本节目录,点击目录中的链接可以快速跳转到对应的内容。
💡 摘要 (Powered by OpenAI)
本文是 BIRD 用户指南的第五章第四节,主要介绍了 BIRD 的过滤器的控制机构 (Control Structures),包括条件语法、for 循环和 case switch。
💬 提示
在 BIRD 中,过滤器支持多种控制结构,包括条件语法、for 循环和 case switch。
BIRD 的过滤器支持多种控制结构 (control structures):
if condition then commandT;
else commandF;
要在循环体内执行多条语句,使用一个块语句 { ... }
来包含要执行的语句。每一行配置均需要使用 ;
进行结尾:
if (condition) {
命令1;
命令2;
...
} else {
命令3;
命令4;
...
}
else
语句为可选项condition
中的计算结果为 true
(非 0 值) 时, if
分支中的语句才会被执行,同时跳过 else
分支中的语句;condition
的计算结果为 false
时,则会跳过 if
分支,如果存在 else
,则会执行 else
中包含的语句。示例:
if 1234 = i then printn "."; else {
print "not 1234";
print "You need {} around multiple commands";
}
if bgp_path ~ BOGON_ASNS then return true;
if (peeras > 65535) then {
# Large BGP community
if (LOCAL_ASN, 0, peeras) ~ bgp_large_community then return false;
} else {
# Standard BGP community
if (0, peeras) ~ bgp_community then return false;
if (LOCAL_ASN, peeras) ~ bgp_community then return true;
if (LOCAL_ASN, LOCAL_ASN) ~ bgp_community then return true;
}
关于布尔值,参见维基百科上的布尔(数据类型)
for 循环允许用户对复合数据 (compound data,如 BGP path, BGP community 列表) 进行迭代,其语法是:
# for [type] variable in expr do command;
for [数据型] 数据名 in 表达式 do 命令;
表达式将会被计算为一个复合数据 (compound data),对于该数据中的每个元素,执行带有分配给变量的项的命令。
如 for int asn in bgp_path
即是将 bgp_path
作为复合数据,将其中的每一项分配给名为 asn
的 int
。
示例:
for int asn in bgp_path do {
printn "ASN: ", asn;
if asn < 65536 then print " (2B)"; else print " (4B)";
}
case
与 Pascal 中的 case 相似,其语法是:
case expr {
else: | num_or_prefix [ .. num_or_prefix]: statement ;
[ ... ]
}
case
后的表达式 (expr
) 可以是任何类型,可以是位于 ~
操作符左侧的任何表达式,或是任何可以作为集合成员的内容{}
分组即可执行多条语句expr
与其中一个 :
子句匹配,则执行它和下一个 :
声明之间的语句。如果 expr
与任何 : 子句都不匹配,则执行 else:
后的语句。示例:
case arg1 {
2: print "two"; print "I can do more commands without {}";
3 .. 5: print "three to five";
else: print "something else";
}
case net.type {
NET_IP4: return net ~ BOGON_PREFIXES_V4;
NET_IP6: return net ~ BOGON_PREFIXES_V6;
else:
# 无需 `{}` 分组即可执行多条语句
print "is_bogon_prefix: unexpected net.type ", net.type, " ", net;
return false;
}
译者
原文作者: <Ondrej Filip>
, <Martin Mares>
, <Maria Matejka>
, <Ondrej Zajicek>
原文链接: https://bird.network.cz/?get_doc&v=20&f=bird-5.html#ss5.4
原文标题: 5.4 Control structures
遵循协议: CC BY-NC-SA 4.0
译者: nelson
翻译时间: 2023-12-15
更新时间: 2024-09-17
本文链接: https://bird.xmsl.dev/docs/user-guide/5-4-control-structures.html