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

imzjd6km  于 2023-02-09  发布在  Shell
关注(0)|答案(6)|浏览(195)

我想检查,如果多个变量设置或没有,如果设置然后只执行脚本代码,否则退出。
比如:

if [ ! $DB=="" && $HOST=="" && $DATE==""  ]; then
  echo "you did not set any variable"
   exit 1;
else
  echo "You are good to go"
fi
q0qdq0h2

q0qdq0h21#

可以使用-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"

由于你使用了bash标记,我使用了一个扩展的测试[[,这意味着我不需要在变量两边使用引号。我假设你需要定义所有三个变量才能继续。if分支中的exit意味着else是多余的。
在任何符合POSIX的shell中执行此操作的标准方法如下所示:

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

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

agyaoht7

agyaoht72#

如果您可以为此编写一个函数,那么它会非常方便。
这个解决方案使用${!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"
q9rjltbz

q9rjltbz3#

最后我使用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
e4eetjau

e4eetjau4#

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

DB=myDB
HOST=myDB
DATE=myDATE

然后测试它们当前是否为emptyunset

#!/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"
mepcadol

mepcadol5#

来自@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
5lhxktic

5lhxktic6#

大家好。我个人在我的bash脚本中使用过这种方法。在bash 4.4和Ubuntu、openSUSE和ClearLinux中验证过。
罐RHEL|中央操作系统|阿尔马和基于Arch的用户让我知道它对你来说很好用?

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

相关问题