我需要检查是否存在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
我怎么能重构这个? :)
答案 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。强>
请注意,根据惯例,环境变量(PATH
,EDITOR
,SHELL
,...)和内部shell变量(BASH_VERSION
,RANDOM
,...)完全资本化。所有其他变量名称应为小写。以来
变量名称区分大小写,这种约定避免意外地覆盖环境和内部变量。
答案 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