bash中unset和empty变量之间的区别

gre*_*n69 11 bash

使用bash,检查变量是否为空的最佳方法是什么?

如果我使用:

if [ -z "$VAR" ]
Run Code Online (Sandbox Code Playgroud)

正如在论坛中所建议的那样,这适用于未设置的变量,但是当变量设置为空时它是正确的.建议?

gee*_*aur 34

${var+set}如果变量未设置并且set设置为包括空字符串的任何内容,则不替换任何内容. 仅当变量设置为非空字符串时才${var:+set}替换set.您可以使用它来测试这两种情况:

if [ "${foo+set}" = set ]; then
    # set, but may be empty
fi

if [ "${foo:+set}" = set ]; then
    # set and nonempty
fi

if [ "${foo-unset}" = unset ]; then
    # foo not set or foo contains the actual string 'unset'
    # to avoid a potential false condition in the latter case,
    # use [ "${foo+set}" != set ] instead
fi

if [ "${foo:-unset}" = unset ]; then
    # foo not set or foo empty or foo contains the actual string 'unset'
fi
Run Code Online (Sandbox Code Playgroud)

  • 为了完善这个答案,你可以补充一点,`-`的工作方式相反,即`$ {foo-unset}`如果未设置foo,则会产生'unset'.这对于干运行脚本非常有用,例如`rsync -avuz $ {DRYRUN --- dry-run} $ HOME/blog/webserver:blog /`必须以`DRYRUN = upblog.sh`运行才能实际执行上传. (3认同)

Kev*_*eck -2

if [ `set | grep '^VAR=$'` ]
Run Code Online (Sandbox Code Playgroud)

这将在变量集列表中搜索字符串“VAR=”。

  • 我投反对票是因为这是不惯用的、笨拙的和低效的。shell 具有用于此目的的内置功能;此外,你[无用地使用反引号](http://www.iki.fi/era/unix/award.html#backticks)并且显然[不完全理解`if`语句的作用。]( http://stackoverflow.com/questions/36371221/bash-if-statement-too-many-arguments/36371520#36371520) (4认同)
  • 如果你打算使用这种方法,至少应该将其更改为“if set | grep -q '^VAR=$'; 然后...` (2认同)