如何检查bash中是否定义了多个变量

问题描述 投票:0回答:7

我想检查是否设置了多个变量,如果设置了则只执行脚本代码,否则退出。

类似:

if [ ! $DB=="" && $HOST=="" && $DATE==""  ]; then
  echo "you did not set any variable"
   exit 1;
else
  echo "You are good to go"
fi      
bash shell
7个回答
118
投票

您可以使用

-z
来测试变量是否未设置或为空:

if [[ -z $DB || -z $HOST || -z $DATE ]]; then
  echo 'one or more variables are undefined'
  exit 1
fi

echo "You are good to go"

正如您使用了 标签一样,我使用了扩展测试

[[
,这意味着我不需要在变量周围使用引号。我假设您需要定义所有三个变量才能继续。
exit
分支中的
if
意味着
else
是多余的。

在任何兼容 POSIX 的 shell 中执行此操作的标准方法如下:

if [ -z "$DB" ] || [ -z "$HOST" ] || [ -z "$DATE" ]; then
  echo 'one or more variables are undefined'        
  exit 1
fi

这里的重要区别是每个变量检查都在单独的测试中进行,并且每个参数扩展都使用双引号。


22
投票

如果您愿意为此目的编写一个函数,那么它会非常方便。

此解决方案使用

${!VAR_NAME}
语法来检查变量是否为空,并且具有告诉您哪些变量名称为空的额外好处。

check_vars()
{
    var_names=("$@")
    for var_name in "${var_names[@]}"; do
        [ -z "${!var_name}" ] && echo "$var_name is unset." && var_unset=true
    done
    [ -n "$var_unset" ] && exit 1
    return 0
}

# Usage for this case
check_vars DB HOST DATE
echo "You are good to go" 

4
投票

我最终使用 variable-variables 来循环访问易于管理的 HEREDOC 变量名列表:

# Ensure non-empty values.
# Loop through HEREDOC, test variable-variable isn't blank.
while read var; do
  [ -z "${!var}" ] && { echo "$var is empty or not set. Exiting.."; exit 1; }
done << EOF
KUBE_NAMESPACE
DOCKER_REGISTRY
DOCKER_DEPLOY_USER
DOCKER_DEPLOY_PASSWORD
DOCKER_DEPLOY_EMAIL
EOF

1
投票

您也可以通过将变量名称放入文件中来检查它

DB=myDB
HOST=myDB
DATE=myDATE

然后测试它们当前是否为

empty
unset

#!/bin/bash
while read -r line; do
    var=`echo $line | cut -d '=' -f1`
    test=$(echo $var)
    if [ -z "$(test)" ]; then 
        echo 'one or more variables are undefined'
        exit 1
    fi
done <var.txt
echo "You are good to go"

1
投票

@joe.still 的好解决方案! 改进是检查完所有变量后退出

i=0
while read var; do
  [ -z "${!var}" ] && { echo "$var is empty or not set. Exiting.."; let i=i+1; }
done << EOF
KUBE_NAMESPACE
DOCKER_REGISTRY
DOCKER_DEPLOY_USER
DOCKER_DEPLOY_PASSWORD
DOCKER_DEPLOY_EMAIL
EOF

if [ $i -gt 0 ]; then
  echo $i
  echo "exiting"
  exit 1
fi

0
投票

大家好。 我个人在我的 bash 脚本中使用过这种方法。已验证可在 Ubuntu、openSUSE 和 ClearLinux 中的 bash 4.4 及更高版本上运行。

RHEL|CentOS|Alma 和 Arch Based 用户可以让我知道它适合您吗?

( [ "$VAR1""$VAR2""$VAR3""$VAR4""$VAR5" ] && echo -e " Warning: StackIsNotClear" ) || { echo -e " GoodNews:  StackIsClear"; }


0
投票

函数一个很好,但对于一个简单的脚本,我只想在脚本开始时使用尽可能少的行,并提供相对容易理解的错误消息

required=(DB HOST DATE)
for var in ${required[@]}; do
  [ -z "${!var}" ] && { echo "$var is empty or not set. Exiting.."; exit 1; }
done
© www.soinside.com 2019 - 2024. All rights reserved.