我有一些Unix shell脚本,在我开始做事情之前,我需要检查某些环境变量是否被设置,所以我做这样的事情:

if [ -z "$STATE" ]; then
    echo "Need to set STATE"
    exit 1
fi  

if [ -z "$DEST" ]; then
    echo "Need to set DEST"
    exit 1
fi

这需要大量的打字。是否有更优雅的习惯用法来检查是否设置了一组环境变量?

编辑:我应该提到的是,这些变量没有任何有意义的默认值-如果没有设置,脚本应该出错。


当前回答

上述解决方案都不符合我的目的,部分原因是我在开始一个漫长的过程之前检查了环境中需要设置的开放式变量列表。最后我得出了这个结论:

mapfile -t arr < variables.txt

EXITCODE=0

for i in "${arr[@]}"
do
   ISSET=$(env | grep ^${i}= | wc -l)
   if [ "${ISSET}" = "0" ];
   then
      EXITCODE=-1
      echo "ENV variable $i is required."
   fi
done

exit ${EXITCODE}

其他回答

在我看来,最简单和最兼容的检查#!/bin/sh是:

if [ "$MYVAR" = "" ]
then
   echo "Does not exist"
else
   echo "Exists"
fi

同样,这是针对/bin/sh的,在旧的Solaris系统上也是兼容的。

对于未来像我这样的人,我想更进一步,参数化var名称,这样我就可以循环一个变量名称的变量大小列表:

#!/bin/bash
declare -a vars=(NAME GITLAB_URL GITLAB_TOKEN)

for var_name in "${vars[@]}"
do
  if [ -z "$(eval "echo \$$var_name")" ]; then
    echo "Missing environment variable $var_name"
    exit 1
  fi
done

我总是用:

if [ "x$STATE" == "x" ]; then echo "Need to set State"; exit 1; fi

恐怕也没那么简洁。

在CSH下有$?STATE。

Bash 4.2引入了-v操作符,用于测试名称是否被设置为任何值,甚至是空字符串。

$ unset a
$ b=
$ c=
$ [[ -v a ]] && echo "a is set"
$ [[ -v b ]] && echo "b is set"
b is set
$ [[ -v c ]] && echo "c is set"
c is set

当然,最简单的方法是在shebang(脚本顶部的行)中添加-u开关,假设你使用的是bash:

# !/ bin / sh -

这将导致脚本退出,如果任何未绑定的变量潜伏在里面。