Bash env var存在检查重构

时间:2016-02-02 15:33:19

标签: string bash environment-variables

我需要检查是否存在env vars列表。 现在我正在做这个当然是一个非常愚蠢的解决方案:

if [ -z "$MONGOLAB" ]; then
  echo "Missing \$MONGOLAB"
  exit 1
fi

if [ -z "$APP_PORT" ]; then
  echo "Missing \$APP_PORT"
  exit 1
fi

if [ -z "$ENV" ]; then
  echo "Missing \$ENV"
  exit 1
fi
... more checks here

我怎么能重构这个? :)

3 个答案:

答案 0 :(得分:4)

您可以使用for循环并在那里检查所有内容:

for var in MONGOLAB APP_PORT ENV; do
    [[ -z "${!var}" ]] && echo "Missing \$$var"
done

答案 1 :(得分:1)

另一种选择是:

[[ $MONGOLAB && $APP_PORT && $ENV ]] || exit 1

如果您碰巧使用多个变量进行长时间的健全性检查,并且代码变得难看,我建议使用 @anubhava 的解决方案,这更加优雅。

我通常使用 die 函数而不是exit 1来更好地描述用户的可读描述和退出状态代码:

##
# die (optional status version): Print a message to
# stderr and exit with either the given status or
# that of the most recent command.
# Usage: some_command || die [status code] "message" ["arguments"...]
#
die() {
  local st="$?"
  if [[ "$1" != *[^0-9]* ]]; then
    st="$1"
    shift
  fi
  warn "$@"
  exit "$st"
}

此功能取自Common utility functions (warn, die),我建议您进一步阅读,也许可以使用最适合您需求的不同版本。 请注意,die使用名为warn的函数,您可以在上面的相同链接中找到该函数。

<强> P.S。

请注意,根据惯例,环境变量(PATHEDITORSHELL,...)和内部shell变量(BASH_VERSIONRANDOM ,...)完全资本化。所有其他变量名称应为小写。以来                 变量名称区分大小写,这种约定避免意外地覆盖环境和内部变量。

答案 2 :(得分:1)

以下是一种方法:

#!/bin/bash
set -e

err=
for v in MONGOLAB APP_PORT ENV; do
    err="$err${!v-$v not set$'\n'}"
done
if test -n "$err"
then printf "%s" "$err" >&2; exit 1
fi

echo "All environment variables set"
exit 0

它改进了您的解决方案,因为它一次性通知用户所有必需但未设置的变量,避免了脚本满足它的典型烦人来回。

我们通过为每个未设置的变量添加一条消息来构建错误值,然后如果它非空,则打印并中止。

${!v-...}构造是间接的 - 如果有一个名为$v的变量,则不用替换,否则替换我们的消息。

替代版本

这使用了所需变量的数组,并构建了一行错误消息:

#!/bin/bash
set -e

required_vars=(MONGOLAB APP_PORT ENV)
missing_vars=''
for v in "${required_vars[@]}"; do
    missing_vars="$missing_vars${!v-$v }"
done
if test -n "$missing_vars"
then printf "Unset required variables: %s\n" "$missing_vars" >&2; exit 1
fi

echo "All environment variables set"
exit 0

替代方案,作为一种功能

#!/bin/bash
set -e

check_vars() {
    local m=''
    for v in "$@"; do
        m="$m${!v-$v }"
    done
    if test -n "$m"
    then printf "Unset required variables: %s\n" "$m" >&2; return 1
    fi
}

check_vars MONGOLAB APP_PORT ENV

echo "All environment variables set"
exit 0