Shell 脚本 - 如果变量为 null 或空则退出脚本

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

我希望在我的 bash 脚本中使用以下变量,但如果它为空或 null,处理它并退出脚本的最佳方法是什么。

tag=$1  

我看到带有“set -u”的答案。我知道这会起作用,但这对生产环境有好处吗?

linux bash shell unix
7个回答
41
投票

有一个内置运算符用于要求设置变量。如果不是,这将导致脚本退出。

tag=${1?Need a value}

通常这与脚本开头附近的

:
无操作一起使用。

: ${1?Need a value}

“未设置或空”的合并有些不同。没有类似的构造用于在空但设置的值上退出,但您可以轻松使用相关语法

${var:-default}
,如果设置且非空,则扩展为
$var
,否则扩展为
default
。还有
${var-default}
,如果变量未正确设置,则仅产生
default

当您想要使用

set -u
但需要处理可能未设置的变量时,这可能特别有用:

case ${var-} in '') echo "$0: Need a value in var" >&2; exit 1;; esac

相对于

case
,我更喜欢
if [ "${var-}" = '' ]
,主要是因为它使我不必在
${var-}
周围加上双引号,以及
$var
中的值的讨厌情况,它被解释为
[
的选项和在您最意想不到的时候给您一条错误消息。 (在 Bash 中,
[[
没有这些问题;但我更喜欢尽可能坚持使用 POSIX shell。)


22
投票

如果你想测试一个变量是否非空,你可以这样做:

if [ -z "$tag" ]; then
    echo "variable tag is empty so program will exit now!"
    exit 1
fi

来自

test
的手册:

-z 字符串

STRING 的长度为零

鉴于您正在使用脚本的位置参数,您还可以通过查看

$#
来测试收到的参数数量。


9
投票

没有人建议

:?
选项。

如果您想确保变量已设置且不为空:

SEARCH_PATH=${DAYS_TO_KEEP:?Must provide DAYS_TO_KEEP.}

将立即退出并使用代码 2 并打印一条消息:

/entrypoint.sh: line 17: SEARCH_PATH: Must provide DAYS_TO_KEEP.

4
投票

我不确定你是否想检测变量是

unset
还是
empty
。这是两件事。具体来说,可以设置一个变量但为空:

$ var=""
$ if [ -z "$var" ]; then echo empty; fi
$ empty

这里也发生同样的事情:

#!/usr/bin/env bash

set -u
echo $1

测试:

$ ./test.sh
./test.sh: line 4: $1: unbound variable
$ ./test.sh ""

$

或者在这里:

#!/usr/bin/env bash

tag=${1?Need a value}
echo $tag

测试:

$ ./se.sh
./se.sh: line 3: 1: Need a value
$ ./se.sh ""

$

其他海报提出了检测未设置和空变量的正确方法。就我个人而言,我喜欢这种检测空变量和未设置变量的方式:

#!/usr/bin/env bash

if [ "$1"A = A ]
then
    echo variable is empty or unset
fi

测试:

$ ./empty.sh ""
variable is empty or unset
$ ./empty.sh
variable is empty or unset
$ ./empty.sh 1
$

1
投票

使用模式匹配来检测该值是否仅包含空格:

pattern=$'*( |\t)'
if [[ $1 = $pattern ]]; then
    echo "First parameter has no non-whitespace characters"
    exit 1
fi

$'...'
引号可以更轻松地向字符串添加制表符。扩展模式
*(...)
匹配 0 个或多个括号内的模式(类似于正则表达式
( |\t)*
)。该模式被分配给一个变量,因为如果其右侧操作数的任何部分被引用,
=
将执行精确的字符串匹配,因此我们预先执行引用以便更容易设置值。


1
投票

我更喜欢 Perl 如何使用“die”,并且在 shell 中很容易做类似的事情。

# Print (optional) error message and exit
# Usage: die [[msg] exit_status]
die() {
    [[ -n "$1" ]] && echo "$1"
    [[ -n "$2" ]] && exit $2 || exit 1
}

[[ -n "$tag" ]] || die "Need a tag argument.  Use $0 --help for details"

这假定使用 bash 或 Korn shell,但可以通过将

[[]]
更改为
[]
来转换为经典 Bourne shell。


0
投票

以下测试确保变量为 Null 或已为其赋值。双引号非常重要,必须使用!

VAL= # Creates a NULL variable
if [[ -z "$VAL" && "$VAL" = ’’ ]]
then
echo "The VAL variable is NULL"
fi
or
VAL=25
if [[ ! -z "$VAL" && "$VAL" != ’’ ]]
then
echo "The VAL variable is NOT NULL"
fi
© www.soinside.com 2019 - 2024. All rights reserved.