如何在Bash中检查变量是否已设置

2359

我如何在Bash中知道一个变量是否已经设置?

例如,我如何检查用户是否提供了函数的第一个参数?

function a {
    # if $1 is set ?
}

17
如果测试 $# 大于 0,则打印“arg <参数>”。 - Jens
284
注意寻求解决方案的人:对于这个问题,有许多评价很高的答案回答了变量是否为空的问题。更正式的解决方案(即“变量是否设置”)在Jens和Lionel回答中提到。 - Nathan Kidd
12
Russell Harmon和Seamus的"-v"测试是正确的,尽管这似乎只在新版本的“bash”中可用,而且不能在不同的shell中移植。 - Graeme
6
正如@NathanKidd所指出的,Lionel和Jens提供了正确的解决方案。prosseek,您应该将您接受的答案切换为其中之一。请参考此处 - Garrett
4
...否则,对于我们中更有眼光的人来说,错误的答案可能会被踩,因为@prosseek没有解决问题。 - dan3
显示剩余8条评论
38个回答

0

如果你想检查$@中是否有任何内容,我找到了一个(更好的)代码来完成这个任务。

if [[ $1 = "" ]]
then
  echo '$1为空'
else
  echo '$1已填充'
fi

为什么要这样做?在Bash中,$@中的所有内容都存在,但默认情况下为空,因此test -ztest -n无法帮助您。

更新:您还可以计算参数中的字符数。

if [ ${#1} = 0 ]
then
  echo '$1为空'
else
  echo '$1已填充'
fi

我知道,但就是这样。如果某个东西为空,你会收到一个错误!抱歉。 :P - user1261322

-1

检查变量是否声明/未设置的函数

包括空的$array=()


以下函数测试给定名称作为变量是否存在

# The first parameter needs to be the name of the variable to be checked.
# (See example below)

var_is_declared() {
    { [[ -n ${!1+anything} ]] || declare -p $1 &>/dev/null;}
}

var_is_unset() {
    { [[ -z ${!1+anything} ]] && ! declare -p $1 &>/dev/null;} 
}
  • 通过首先测试变量是否已设置,可以避免调用declare,如果不必要的话。
  • 但是,如果$1包含空的$array=()的名称,则调用declare将确保我们获得正确的结果。
  • 很少有数据传递到/dev/null,因为只有在变量未设置或为空数组时才调用declare。

此函数将根据以下条件进行测试:

a;       # is not declared
a=;      # is declared
a="foo"; # is declared
a=();    # is declared
a=("");  # is declared
unset a; # is not declared

a;       # is unset
a=;      # is not unset
a="foo"; # is not unset
a=();    # is not unset
a=("");  # is not unset
unset a; # is unset

.

更多细节

有关测试脚本的详细信息,请参阅我对问题"如何检查bash中是否存在变量?"答案

备注:declare -p 的类似用法,正如 Peregring-lk答案 所示,是真正的巧合。否则我当然会致谢!


-1
如果您想测试一个变量是否已绑定或未绑定,即使在打开了nounset选项后,这也可以很好地工作:
set -o noun set

if printenv variableName >/dev/null; then
    # variable is bound to a value
else
    # variable is unbound
fi

1
我想你的意思是 set -o nounset,而不是 set -o noun set。这仅适用于已经被 export 的变量。它还以一种难以撤销的方式更改了您的设置。 - Keith Thompson
如果真的想采用这种方法,无论出于什么原因,子shell 是正确的方式:if (set -u; : $var) 2>/dev/null。或者更简单的方式:if (: ${var?}) 2>/dev/null - usretc

-1
if [[ ${1:+isset} ]]
then echo "It was set and not null." >&2
else echo "It was not set or it was null." >&2
fi

if [[ ${1+isset} ]]
then echo "It was set but might be null." >&2
else echo "It was was not set." >&2
fi

$1、$2以及$N都已设置。很抱歉,这次失败了。 - user1261322
我尝试了一下,但没有成功,可能是我的bash版本不支持。我不确定,如果我错了,请原谅。 :) - user1261322

-1
声明一个简单的函数is_set,它使用declare -p直接测试变量是否存在。
$ is_set() {
    declare -p $1 >/dev/null 2>&1
}

$ is_set foo; echo $?
0

$ declare foo

$ is_set foo; echo $?
1

-2

我总是使用这个,因为它似乎很容易被任何第一次看到代码的人理解:

if [ "$variable" = "" ]
    then
    echo "Variable X is empty"
fi

而且,如果想要检查是否为空;

if [ ! "$variable" = "" ]
    then
    echo "Variable X is not empty"
fi

就是这样。


5
问题要求检查变量是否已设置,而不是变量是否为空。 - HelloGoodbye
你可能需要使用[[ ... ]]而不是[ ... ]。后者实际上是一个外部命令,无法看到变量是否设置。 - solidsnack

-3

检查一个变量是否设置:

var=""; [[ $var ]] && echo "set" || echo "not set"

6
如果$var的值为空字符串,这将失败。 - HelloGoodbye

-4
case "$1" in
 "") echo "blank";;
 *) echo "set"
esac

4
如果$1被设置为空字符串,这将失败。 - HelloGoodbye

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接