Bash函数检查是否设置了给定变量

Bash函数检查是否设置了给定变量,bash,Bash,如中所述,检查bash中是否设置了变量的“正确”方法如下所示: if [ -z ${var+x} ]; then echo "var is unset" else echo "var is set to '$var'" fi 我感兴趣的是如何将其提取到一个可以为不同变量重用的函数中 到目前为止,我能做的最好的事情是: is_set() { local test_start='[ ! -z ${' local test_end='+x} ]' local tester

如中所述,检查bash中是否设置了变量的“正确”方法如下所示:

if [ -z ${var+x} ]; then
    echo "var is unset"
else
    echo "var is set to '$var'"
fi
我感兴趣的是如何将其提取到一个可以为不同变量重用的函数中

到目前为止,我能做的最好的事情是:

is_set() {
  local test_start='[ ! -z ${'
  local test_end='+x} ]'
  local tester=$test_start$1$test_end

  eval $tester
}

这似乎是可行的,但有没有更好的方法不调用
eval

在Bash中,您可以使用
[[-v var]]
。不需要函数或复杂的方案

从手册页:

前两个命令序列打印
ok

[[ -v PATH ]] && echo ok

var="" ; [[ -v var ]] && echo ok

unset var ; [[ -v var ]] && echo ok

使用
[…]]
,您可以简单地执行此操作(不需要双引号):

如果您确实需要函数,那么我们可以编写一行程序:

is_empty()     { ! [[ $1 ]]; } # check if not set or set to empty string
is_not_empty() {   [[ $1 ]]; } # check if set to a non-empty string

var="apple"; is_not_empty "$var" && echo "var is not empty" # shows "var is not empty"
var=""     ; is_empty "$var"     && echo "var is empty"     # shows "var is empty"
unset var  ; is_empty "$var"     && echo "var is empty"     # shows "var is empty"
var="apple"; is_empty "$var"     || echo "var is not empty" # shows "var is not empty"
最后,
is_unset
is_set
可以实现为将
$1
作为变量的名称:

is_unset() {   [[ -z "${!1+x}" ]]; }           # use indirection to inspect variable passed through $1 is unset
is_set()   { ! [[ -z "${!1+x}" ]]; }           # check if set, even to an empty string

unset var; is_unset var && echo "var is unset" # shows "var is unset"
var=""   ; is_set var   && echo "var is set"   # shows "var is set"
var="OK" ; is_set var   && echo "var is set"   # shows "var is set"

相关的

创建一个函数来测试是否设置了变量似乎不是一个好主意。您可以使用
eval
不推荐对要检查的变量进行硬编码(这没有意义),尤其是当您无法绝对确定变量内容时,或者将要检查的变量值作为一个参数传递,将您带回
[-z$1]]
首先测试。这里有一个微妙的区别:
[[-z$var]]
如果
var
是空字符串或未设置,则返回true
[[-z${var+x}]]
严格测试未设置项。@John1024:捕捉得好@Rankin我想写一个函数,使代码能够自我记录,因为语法非常神秘。考虑到其中的复杂性,我同意你的观点,这让我思考了记录你正在编写的领域逻辑和记录语言本身的工作之间的区别。由于语言阻碍了我在这里的努力,我将坚持使用最简单的方法,而不是尝试将其封装到函数中。我不是100%确定在bash 3中会得到相同的结果,但您可以使用
间接检查变量
operator
isunset(){[[-z${!1+x}]];}
如果isunset变量;那么echo var没有设置我猜这是在比我运行的版本更新的Bash中添加的?我得到了
bash:conditional binary操作符,但我使用的是OSX附带的bash版本(3.2.57)。我可能无论如何都应该升级,但我写这个脚本是为了帮助同事们建立他们的开发环境的一部分,所以可移植性是一个值得关注的问题。它在Bash3中工作吗?在一个函数中运行
eval
进行简单的检查是很难看的,而且会带来麻烦。是的,
[[[-z${var+x}]]
方法在Bash3中有效。我会坚持的。很高兴知道添加了
-v
,谢谢!
is_empty()     { ! [[ $1 ]]; } # check if not set or set to empty string
is_not_empty() {   [[ $1 ]]; } # check if set to a non-empty string

var="apple"; is_not_empty "$var" && echo "var is not empty" # shows "var is not empty"
var=""     ; is_empty "$var"     && echo "var is empty"     # shows "var is empty"
unset var  ; is_empty "$var"     && echo "var is empty"     # shows "var is empty"
var="apple"; is_empty "$var"     || echo "var is not empty" # shows "var is not empty"
is_unset() {   [[ -z "${!1+x}" ]]; }           # use indirection to inspect variable passed through $1 is unset
is_set()   { ! [[ -z "${!1+x}" ]]; }           # check if set, even to an empty string

unset var; is_unset var && echo "var is unset" # shows "var is unset"
var=""   ; is_set var   && echo "var is set"   # shows "var is set"
var="OK" ; is_set var   && echo "var is set"   # shows "var is set"