bash函数不支持像其他高级语言一样的高级的返回变量,bash只能返回数值。
bash有bool变量,但是bool操作符号只能存在于[ ... ]
、[[ ... ]]
等特定语法结构中
举个例子 bash中,想要对bool变量y取反并赋值给变量x ,这样写x=!$y
是不合法的,这种诉求是很常见的
此时 要么放弃bash,比如换成别的脚本语言fish、nushell、zsh等等,或者干脆换成py
但bash比起py也有好的一面,bash比py还简洁
那么bash中到底如何写一个逻辑取反函数呢?
最丑陋的办法 是 返回值让全局变量承载,但这太丑了,如果脚本很多,有重名变量,难以排查,是给自己埋雷。
好一点的办法 用eval实现像c语言中指针的味道,比方下面这个实现:
shell
#!/bin/bash
# fileName: bool_not.sh
#【描述】 bool取反
#【依赖】
#【术语】
#【备注】
_importBSFn "argCntEq2.sh"
function bool_not() {
#断言有两个参数
argCntEq2 $* || return $?
#输入bool值
local inBoolVar=$1
#返回 全局变量名
local outBoolVarName=$2
#取反,放入变量notBoolVar中
local notBoolVar=false; $inBoolVar || notBoolVar=true;
#利用eval将结果局部变量赋值给入参指定的全局变量
eval "$outBoolVarName=$notBoolVar"
}
#使用举例
#source bool_not.sh
# x=true ; bool_not $x "not_x" ; echo $not_x
# eval执行了 not_x=false
# 变量not_x为false
# y=false ; bool_not $y "not_y" ; echo $not_y
# eval执行了 not_y=true
# 变量not_y为true