Bash函数用于检查给定变量是否已设置。

15 浏览
0 Comments

Bash函数用于检查给定变量是否已设置。

这个答案中所解释的,检查变量在bash中是否设置的\"正确\"方式如下所示:\n

if [ -z ${var+x} ]; then
    echo "var未设置"
else
    echo "var设置为'$var'"
fi

\n我感兴趣的是如何将其提取为一个可以用于不同变量的函数。\n到目前为止,我能够做到的最好的是:\n

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

\n它似乎工作正常,但是否有一种更好的方法而不需要调用eval

0
0 Comments

Bash函数检查给定变量是否设置的原因是为了在脚本中判断某个变量是否已经被赋值。这是一种常见的需求,因为在脚本中,我们经常需要根据某些条件来执行不同的操作,而这些条件通常是通过变量的值来判断的。

然而,在Bash的不同版本中,检查变量是否设置的方法略有不同。在Bash 4.2及以上版本中,可以使用`-v`选项来检查变量是否设置,如下所示:

if [[ -v $MY_VARIABLE ]]; then
    echo "MY_VARIABLE is set"
fi

但是,在旧版本的Bash中,比如MacOS上的Bash,在没有`-v`选项的情况下,我们需要使用另一种方法来判断变量是否设置。可以使用`${MY_VARIABLE+set}`来检查变量是否设置,如下所示:

if [[ -n ${MY_VARIABLE+set} ]]; then
    echo "MY_VARIABLE is set"
else
    echo "MY_VARIABLE is not set"
fi

这种方法的原理是,`${MY_VARIABLE+set}`会展开为`set`,如果`MY_VARIABLE`已经被设置,则展开为`set`,否则为空字符串。然后,我们可以通过判断展开后的结果是否为空来判断变量是否设置。

总结起来,Bash函数检查给定变量是否设置的原因是为了在脚本中判断变量是否已经被赋值。解决方法是根据Bash版本的不同,使用不同的判断语句来检查变量是否设置。在Bash 4.2及以上版本中,可以使用`-v`选项来检查变量是否设置;而在旧版本的Bash中,可以使用`${MY_VARIABLE+set}`来检查变量是否设置。这样,我们就可以根据变量是否设置来执行不同的操作。

0
0 Comments

Bash函数检查给定变量是否设置的问题出现的原因是需要在Bash脚本中判断一个变量是否被设置。为了解决这个问题,可以使用Bash的条件语句来判断变量是否被设置,也可以编写一个函数来实现这个功能。

首先,可以使用条件语句[[ ... ]]来判断变量是否被设置。如果变量被设置,则条件[[ $var ]]为真,可以执行相应的操作,例如输出"var is set"。如果变量未被设置或者为空字符串,则条件[[ $var ]]为假,可以执行相应的操作,例如输出"var is not set or it holds an empty string"。

如果确实需要编写一个函数来判断变量是否被设置,可以使用一行代码来定义函数。例如,可以定义is_empty()函数来判断变量是否未被设置或者被设置为空字符串,可以使用is_not_empty()函数来判断变量是否被设置为非空字符串。可以通过传递变量作为参数来调用这些函数,并根据函数的返回值执行相应的操作。

最后,可以实现is_unsetis_set函数来判断变量是否被设置,这里将$1作为变量的名称。可以使用-z "${!1+x}"来检查变量是否未被设置,使用--z "${!1+x}"的否定形式来检查变量是否被设置。可以通过传递变量的名称作为参数来调用这些函数,并根据函数的返回值执行相应的操作。

这样,通过使用条件语句或者编写函数,就可以判断一个给定的变量是否被设置了。

相关链接:

- [Test for non-zero length string in Bash: [ -n "$var" ] or [ "$var" ]](https://stackoverflow.com/a/49825114/6862601)

0
0 Comments

在Bash中,可以使用[[ -v var ]]来判断一个变量是否被设置。不需要使用函数或复杂的方案。

从manpage中可以看到:

   -v varname
          如果shell变量varname已设置(已被赋值),则为真。

前两个命令序列打印出ok

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

我猜这个功能是在比我使用的版本更新的Bash中添加的。我得到的是bash: conditional binary operator expected,但我正在使用的是随OSX一起提供的Bash版本(3.2.57)。我也应该升级一下,但我正在编写这个脚本来帮助同事设置他们的开发环境的一部分,所以可移植性是一个问题。

然后,像之前指出的那样,[[ -z ${var+x} ]]是一种更简洁的方式,这是正确的方式。在Bash 3中是否有效?在函数中运行eval来进行简单的检查是丑陋的,也容易出问题。

是的,[[ -z ${var+x} ]]的方法在Bash 3中有效。我会坚持使用这个方法。知道添加了-v是好的,谢谢!

0