如何在Bash中通过函数调用实现逻辑或(OR)的主机归属判断
Bash函数判断当前主机是否为A或B的正确写法
原函数说明
你已有的判断主机的Bash函数运行正常,代码如下:
_on_host() { [[ $(hostname) =~ ^$1.* ]]; }
该函数通过正则匹配主机名前缀,以退出状态返回布尔值(0为真,非0为假)。
问题需求
编写一个函数,判断当前是否处于主机A或主机B。
失败尝试及报错
你尝试的几种写法均出现错误:
- 尝试1:
juju() { [[ _on_host aaa || _on_host bbb ]]; }
报错信息:
-bash: conditional binary operator expected -bash: syntax error near `aaa'
- 尝试2:
juju() { [ _on_host x100 -o _on_host borealis ]; }
执行juju命令时报错:
-bash: [: too many arguments
- 尝试3:
juju() { [[ _on_host aaa ]] || [[ _on_host bbb ]]; }
报错信息:
-bash: conditional binary operator expected -bash: syntax error near `aaa'
正确写法及解释
写法一:直接用逻辑或连接函数调用
juju() { _on_host aaa || _on_host bbb; }
Bash中函数的返回值对应最后一条命令的退出状态:0代表成功(逻辑真),非0代表失败(逻辑假)。||是逻辑或运算符,具备短路特性——只要第一个函数调用成功,就不会执行第二个;仅当两个函数都失败时,整个表达式返回非0(假)。
写法二:在条件表达式中判断函数退出状态
如果要使用[[ ... ]]结构,需显式判断函数的退出状态:
juju() { [[ $(_on_host aaa) -eq 0 || $(_on_host bbb) -eq 0 ]]; }
这里$(_on_host aaa)执行函数并获取其退出状态,-eq 0用于判断函数执行成功(即当前主机匹配aaa)。
进阶优化:让原函数支持多参数判断
直接修改原_on_host函数,使其支持传入多个主机前缀,自动实现逻辑或判断:
_on_host() { local current_host=$(hostname) for prefix in "$@"; do [[ $current_host =~ ^$prefix.* ]] && return 0 done return 1 }
之后直接调用_on_host aaa bbb即可判断当前主机是否为aaa或bbb,无需额外编写新函数。
内容的提问来源于stack exchange,提问作者Łukasz Ślusarczyk
相关产品推荐
相关产品推荐

