bash逻辑取反技巧(bool_not函数)

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